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"}