Latest web development tutorials

MongoDB 正則表達式

正則表達式是使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。

許多程序設計語言都支持利用正則表達式進行字符串操作。

MongoDB使用$regex操作符來設置匹配字符串的正則表達式。

MongoDB使用PCRE (Perl Compatible Regular Expression) 作為正則表達式語言。

不同於全文檢索,我們使用正則表達式不需要做任何配置。

考慮以下posts集合的文檔結構,該文檔包含了文章內容和標籤:

{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}

使用正則表達式

以下命令使用正則表達式查找包含w3cschool.cc 字符串的文章:

>db.posts.find({post_text:{$regex:"w3cschool.cc"}})

以上查詢也可以寫為:

>db.posts.find({post_text:/w3cschool.cc/})

不區分大小寫的正則表達式

如果檢索需要不區分大小寫,我們可以設置$options 為$i。

以下命令將查找不區分大小寫的字符串w3cschool.cc:

>db.posts.find({post_text:{$regex:"w3cschool.cc",$options:"$i"}})

集合中會返回所有包含字符串w3cschool.cc 的數據,且不區分大小寫:

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on  W3Cschool.cc", 
   "tags" : [ "tutorialspoint" ]
} 

數組元素使用正則表達式

我們還可以在數組字段中使用正則表達式來查找內容。 這在標籤的實現上非常有用,如果你需要查找包含以tutorial 開頭的標籤數據(tutorial 或tutorials 或tutorialpoint 或tutorialphp), 你可以使用以下代碼:

>db.posts.find({tags:{$regex:"tutorial"}})

優化正則表達式查詢

  • 如果你的文檔中字段設置了索引,那麼使用索引相比於正則表達式匹配查找所有的數據查詢速度更快。

  • 如果正則表達式是前綴表達式,所有匹配的數據將以指定的前綴字符串為開始。 例如:如果正則表達式為^tut ,查詢語句將查找以tut為開頭的字符串。

這裡面使用正則表達式有兩點需要注意:

正則表達式中使用變量。 一定要使用eval將組合的字符串進行轉換,不能直接將字符串拼接後傳入給表達式。 否則沒有報錯信息,只是結果為空! 實例如下:

var name=eval("/" + 变量值key +"/i"); 

以下是模糊查詢包含title關鍵詞, 且不區分大小寫:

title:eval("/"+title+"/i")    // 等同于 title:{$regex:title,$Option:"$i"}