MongoDBRegex及應用_Regex

來源:互聯網
上載者:User

Regex常用來在所有語言中搜尋字串的任何模式或文字。MongoDB還提供了Regex功能的字串模式使用Regex$regex操作符。MongoDB使用PCRE(Perl相容Regex)為Regex語言。

不同於文本搜尋,我們不需要做任何配置或命令就能直接使用Regex。

考慮下包含文字後其標籤的文章集合,文檔結構如以下:

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

使用Regex表達

下面的Regex查詢搜尋所有包含字串 yiibai.com 的文章:

複製代碼 代碼如下:

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

同樣的查詢也可以寫為:

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

使用Regex不區分大小寫

為了使搜尋不區分大小寫,我們使用$options 帶有值參數 $i。下面的命令會搜尋字串:yiibai.com,不論大小寫:

複製代碼 代碼如下:

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

該查詢重新調整的結果是:其中在大小下包含詞語 yiibai 文檔,如以下:

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

使用Regex的數組元素:

我們還可以使用數組欄位Regex概念。 這時候我們實現標籤的功能顯得尤為重要。 所以,如果想要搜尋帶有標籤以片語tutorial開始所有的文章(無論是tutorial或tutorials或tutorialjava或tutorialphp),都可以使用下面的代碼:

複製代碼 代碼如下:

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

最佳化Regex查詢:

如果文檔欄位已被索引,查詢將使用使用索引值的匹配Regex。 這使得搜尋非常快,Regex相對於掃描整個集合。

如果Regex是一個首碼運算式,所有的匹配是以某一串字元開始。例如,如果Regex ^tut, 查詢有只搜尋那些開始串 tut.

mongodbRegex應用

mongodb中完全支援Regex,一般查詢中可以使用操作符$regex

db.lnmopy.find( { 'name': /*.lnmopy.com/i } )db.lnmopy.find( { 'name': { $regex: '*.lnmopy.com', $options: 'i' } } )

以上兩種完全等價,可以直接對域(field)即上例中的'name'鍵,使用Regex或者使用操作符,可選項目是i,即忽略大小寫。
關於正則可選項,mongodb和其他語言標準正則稍有不同,有自己的標準。

$options的可選值

i 忽略大小寫;

m 多行尋找,如果內容裡面不存在分行符號號(例如 \n)或者構造上沒有(start/end),該選項沒有任何效果;
x 空白字元除了被轉義的或在字元類中的以外完全被忽略,在未轉義的字元類之外的 # 以及下一個分行符號之間的所有字元,包括兩頭,也都被忽略;

s 圓點元字元(.)匹配所有的字元,包括分行符號

假設我們有一個資料庫名為mongoDemo

use mongoDemo

資料庫中有個集合名為lnmopy

db.lnmopy.find()

有如下資料:

{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "www.lnmopy.com", "site" : "website", "tag" : "l,n,m,o,p,y"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "demo.lnmopy.com", "site" : "unknown", "tag" : "d,e,m,o"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "welcome.lnmopy.com", "site" : "website", "tag" : "w,e,l,c,o,m,e"}

mongodb的Regex僅支援i和m的javascript原生寫法(如/*.lnmopy.com/i)。如果要是用x和s選項就必須使用“$regex”操作符並在“$options”中指定選項。

使用Regex的更新操作:

db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } );

意思是,尋找當前資料庫中名為“lnmopy”的集合中“name”欄位符合“/*.lnmopy.com/i”正則的條目,並只將“site”欄位更新為“www.lnmopy.com”,該條更新語句僅更新一條資料,如果不是用$set,那麼這條記錄就會只剩下你更新的部分和預設的ObjectId,可以說是替換了。如果想替換所有,可以加入參數:

db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } , false, true);

參數有順序,false是upsert,如果沒有就插入新的。true就是multi多條記錄更新,所有匹配到的結果。或者直接指定{ multi: true }:
db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } , { multi: true });
這樣就把所有的“site”欄位全都更新為“www.lnmopy.com”了。

我設計的欄位“tag”有個缺陷,就是本來是一個單詞,現在每個字母都被“,“分隔開了。實際工作中也存在類似問題,由於批量轉換資料,或者其他程式操作不當,或者業務需求更改等等原因需要對某些欄位進行正則批量處理,mongodb的一般更新方法是不能實現的,這時就需要使用javascript語句。

Regex替換查詢結果中','為”

db.lnmopy.find().forEach( function(u) { u.tag = u.tag.replace(/\,/, ""); db.lnmopy.save(u); } );

最後執行

db.lnmopy.find()

顯示如下資料:

{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "www.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "lnmopy"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "demo.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "demo"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "welcome.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "welcome"}

後記:javascript是mongodb的一大特色,也是優勢,很多複雜的查詢和處理都可以用javascript實現,要注意的是,javascript的工作效率較低,原則上應該盡量避免在主要商務邏輯中大量使用。類比的講,javascript就相當於oracle的預存程序,介於10gen(mongodb的Team Dev)是由oracle出來的這點,就一點也不奇怪了。關於如何使用更複雜的javascript,以後會寫到。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.