MongoDB 正則表示式

MongoDB 正則表示式

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

許多程式設計語言都支援利用正則表示式進行字串操作。

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

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

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

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

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

使用正則表示式

以下命令使用正則表示式查詢包含 itread01 字串的文章:

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

以上查詢也可以寫為:

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

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

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

以下命令將查詢不區分大小寫的字串 itread01:

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

集合中會返回所有包含字串 itread01 的資料,且不區分大小寫:

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

陣列元素使用正則表示式

我們還可以在陣列欄位中使用正則表示式來查詢內容。 這在標籤的實現上非常有用,如果你需要查詢包含以 run 開頭的標籤資料(ru 或 run 或 itread01), 你可以使用以下程式碼:

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

優化正則表示式查詢

  • 如果你的文件中欄位設定了索引,那麼使用索引相比於正則表示式匹配查詢所有的資料查詢速度更快。

  • 如果正則表示式是字首表示式,所有匹配的資料將以指定的字首字串為開始。例如: 如果正則表示式為 ^tut ,查詢語句將查詢以 tut 為開頭的字串。

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

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

var name=eval("/" + 變數值key +"/i"); 

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

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