MongoDB 正規表示式教程
正規表示式用於模式匹配,基本上用於文件中的發現字串。
有時,在檢索集合中的文件時,你可能無法確切知道要搜尋的確切欄位值。因此,可以使用正規表示式來幫助基於模式匹配搜尋值來檢索資料。
在本教程中,你將學習 -
-
使用
$regex
運算子進行模式匹配 -
與
$
選項匹配的模式 -
沒有正規表示式運算子的模式匹配
-
從集合中提取最後
n
個檔案
使用 $regex
運算子進行模式匹配
MongoDB 中的正規表示式運算子用於搜尋集合中的特定字串。以下示例顯示瞭如何完成此操作。
假設我們有相同的 Employee 集合,其欄位名稱為 Employeeid
和 EmployeeName
。我們也假設我們的藏品中有以下檔案。
員工 ID | 員工姓名 |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Tastones |
6 | Gurang |
在下面的程式碼中,我們使用了正規表示式運算子來指定搜尋條件。
> db.Employee.find({EmployeeName : {$regex: "Gu"}}).foreach(printjson)
程式碼說明:
- 在這裡,我們要查詢所有其中包含字元
Gu
的員工姓名。因此,我們指定$regex
運算子來定義Gu
的搜尋條件 printjson
用於列印查詢以更好的方式返回的每個文件。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
{
"_id" : ObjectId("563c4fbffa0d1cc156e17102"),
"Employeeid" : 100,
"EmployeeName" : "Guru99"
}
{
"_id" : objectId("563c4fc8fa0d1cc156e17103"),
"Employeeid" : 6,
"EmployeeName" : "Gurang"
}
輸出清楚地顯示返回員工姓名包含 Gu
字元的那些文件。
如果你的集合中包含以下文件,並且其他文件中包含 員工名稱
為 Tastones9
。如果你將搜尋條件輸入為 Tastones
,它還將返回具有 Tastones9
的文件。但是假設我們不想要這個並且只想用 Tastones
返回文件。然後我們可以通過精確的模式匹配來完成要進行精確的模式匹配,我們將使用^和$字元。我們將在字串的開頭新增^字元,在字串的末尾新增$。
員工 ID | 員工姓名 |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Tastones |
6 | Gurang |
8 | Tastones9 |
以下示例顯示瞭如何完成此操作。
> db.Employee.find({EmployeeName : {$regex: "^Tastones$" }}).forEach(printjson)
程式碼說明:
- 在搜尋條件中,我們使用的是
^
和$
字元。^
用於確保字串以特定字元開頭,$
用於確保字串以特定字元結尾。因此,當程式碼執行時,它將僅獲取名為Tastones
的字串。 - printjson 用於列印查詢以更好的方式返回的每個文件。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.find({EmployeeName : {$regex: "^Tastones$" }}).forEach(printjson)
{
"_id" : ObjectId("563c4fbffa0d1cc156e17102"),
"Employeeid" : 100,
"EmployeeName" : "Tastones"
}
在輸出中,可以清楚地看到字串 Tastones
被取出。
與 $options
匹配的模式
使用正規表示式運算子時,還可以使用 $options
關鍵字提供其他選項。例如,假設你想要查詢其員工姓名中包含 Gu
的所有文件,而不管它是區分大小寫還是不區分大小寫。如果需要這樣的結果,那麼我們需要使用 $options
和 case insensitivity
引數。
以下示例顯示瞭如何完成此操作。
假設我們有相同的 Employee 集合,其欄位名稱為 Employeeid
和 EmployeeName
。
我們也假設我們的集合中有以下檔案。
員工 ID | 員工姓名 |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Tastones |
6 | Gurang |
7 | Guru99 |
現在,如果我們執行與上一個主題相同的查詢,我們將永遠不會在結果中看到帶有 GURU99
的文件。為了確保在結果集中出現這種情況,我們需要新增 $options: 'I'
引數。
> db.Employee.find({EmployeeName:{$regex: "Gu", $options:'i' }}).forEach(printjson)
程式碼說明:
- 帶有
i
引數的$options
(表示不區分大小寫)指定我們要執行搜尋,無論我們是否在大寫或小寫中找到字母Gu
。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.find({EmployeeName: {$regex: "Gu", $options:'i'}}).forEach(printjson)
{
"_id" : ObjectId("563c4fbffa0d1cc156e17102"),
"Employeeid" : 100,
"EmployeeName" : "Guru99",
}
{
"_id" : objectId("563c4fc8fa0d1cc156e17103"),
"Employeeid" : 6,
"EmployeeName" : "Gurang"
}
{
"_id" : ObjectId("563c52e8fa0d1cc156e17104"),
"Employeeid" : 7,
"EmployeeName" : "GURU99"
}
- 輸出清楚地表明,即使一個文件的大寫字母為
Gu
,文件仍會顯示在結果集中。
沒有正規表示式運算子的模式匹配
也可以在沒有正規表示式運算子的情況下進行模式匹配。以下示例顯示瞭如何完成此操作。
> db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
程式碼說明:
/../
選項基本上意味著在這些分隔符中指定搜尋條件。因此,我們指定/Gu/
找到那些在其 EmployeeName 中具有Gu
的文件。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
{
"_id" : ObjectId("563c4fbffa0d1cc156e17102"),
"Employeeid" : 100,
"EmployeeName" : "Guru99",
}
{
"_id" : objectId("563c4fc8fa0d1cc156e17103"),
"Employeeid" : 6,
"EmployeeName" : "Gurang"
}
輸出清楚地顯示返回員工姓名包含 Gu
字元的那些文件。
從集合中獲取最後的 n
個文件
有多種方法可以在集合中獲取最後 n 個文件。
讓我們通過以下步驟來看看其中一種方法
以下示例顯示瞭如何完成此操作。
假設我們有相同的 Employee 集合,其欄位名稱為 Employeeid
和 EmployeeName
。
我們也假設我們的集合中有以下檔案:
員工 ID | 員工姓名 |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Tastones |
6 | Gurang |
7 | GURU99 |
> db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
程式碼說明:
-
查詢文件時,使用
sort
函式根據集合中的_id 欄位值以相反的順序對記錄進行排序。-1
基本上表示以相反順序或降序對文件進行排序,以使最後一個文件成為要顯示的第一個文件。 -
然後使用 limit 子句只顯示所需的記錄數。這裡我們設定了
limit(2)
,因此它將獲取最後兩個文件。
如果命令執行成功,將顯示以下輸出:
輸出:
> db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
{
"_id" : ObjectId("563c4fbffa0d1cc156e17102"),
"Employeeid" : 100,
"EmployeeName" : "Guru99",
}
{
"_id" : objectId("563c4fc8fa0d1cc156e17103"),
"Employeeid" : 6,
"EmployeeName" : "Gurang"
}
輸出清楚地顯示了集合中的最後兩個文件。因此,我們已經清楚地表明,要獲取集合中的最後 n
個文件,我們可以先按降序對文件進行排序,然後使用 limit 子句返回所需的 n
個文件。
注意:如果對大於 38,000 個字元的字串執行搜尋,則不會顯示正確的結果。
概要:
$regex
運算子可以實現模式匹配。此運算子可用於查詢集合中的某些字串。^
和$
符號可用於精確文字搜尋,其中^
用於確保字串以特定字元開頭,$
用於確保字串以特定字元結尾。i
和$regex
運算子可用於指定不區分大小寫,以便可以搜尋字串,無論它們是小寫還是大寫。- 分隔符
//
也可用於模式匹配。 - 使用 sort 和 limit 函式的組合返回集合中的最後 n 個文件。sort 函式可用於按降序返回文件,之後 limit 子句可用於限制返回的文件數。