MongoDB 正規表示式教程

正規表示式用於模式匹配,基本上用於文件中的發現字串。

有時,在檢索集合中的文件時,你可能無法確切知道要搜尋的確切欄位值。因此,可以使用正規表示式來幫助基於模式匹配搜尋值來檢索資料。

在本教程中,你將學習 -

  • 使用 $regex 運算子進行模式匹配

  • $ 選項匹配的模式

  • 沒有正規表示式運算子的模式匹配

  • 從集合中提取最後 n 個檔案

使用 $regex 運算子進行模式匹配

MongoDB 中的正規表示式運算子用於搜尋集合中的特定字串。以下示例顯示瞭如何完成此操作。

假設我們有相同的 Employee 集合,其欄位名稱為 EmployeeidEmployeeName。我們也假設我們的藏品中有以下檔案。

員工 ID 員工姓名
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Tastones
6 Gurang

在下面的程式碼中,我們使用了正規表示式運算子來指定搜尋條件。

> db.Employee.find({EmployeeName : {$regex: "Gu"}}).foreach(printjson)

程式碼說明:

  1. 在這裡,我們要查詢所有其中包含字元 Gu 的員工姓名。因此,我們指定 $regex 運算子來定義 Gu 的搜尋條件
  2. 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)

程式碼說明:

  1. 在搜尋條件中,我們使用的是 ^$ 字元。 ^ 用於確保字串以特定字元開頭,$ 用於確保字串以特定字元結尾。因此,當程式碼執行時,它將僅獲取名為 Tastones 的字串。
  2. printjson 用於列印查詢以更好的方式返回的每個文件。

如果命令執行成功,將顯示以下輸出:

輸出:

> db.Employee.find({EmployeeName : {$regex: "^Tastones$" }}).forEach(printjson)
{
    "_id" : ObjectId("563c4fbffa0d1cc156e17102"), 
    "Employeeid" : 100,
    "EmployeeName" : "Tastones"
}

在輸出中,可以清楚地看到字串 Tastones 被取出。

$options 匹配的模式

使用正規表示式運算子時,還可以使用 $options 關鍵字提供其他選項。例如,假設你想要查詢其員工姓名中包含 Gu 的所有文件,而不管它是區分大小寫還是不區分大小寫。如果需要這樣的結果,那麼我們需要使用 $optionscase insensitivity 引數。

以下示例顯示瞭如何完成此操作。

假設我們有相同的 Employee 集合,其欄位名稱為 EmployeeidEmployeeName

我們也假設我們的集合中有以下檔案。

員工 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)

程式碼說明:

  1. 帶有 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"
}
  1. 輸出清楚地表明,即使一個文件的大寫字母為 Gu,文件仍會顯示在結果集中。

沒有正規表示式運算子的模式匹配

也可以在沒有正規表示式運算子的情況下進行模式匹配。以下示例顯示瞭如何完成此操作。

> db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

程式碼說明:

  1. /../ 選項基本上意味著在這些分隔符中指定搜尋條件。因此,我們指定 /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 集合,其欄位名稱為 EmployeeidEmployeeName

我們也假設我們的集合中有以下檔案:

員工 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)

程式碼說明:

  1. 查詢文件時,使用 sort 函式根據集合中的_id 欄位值以相反的順序對記錄進行排序。 -1 基本上表示以相反順序或降序對文件進行排序,以使最後一個文件成為要顯示的第一個文件。

  2. 然後使用 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 子句可用於限制返回的文件數。