中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MongoDB的正則表達式如何使用

發布時間:2021-07-16 17:01:05 來源:億速云 閱讀:187 作者:Leah 欄目:互聯網科技

今天就跟大家聊聊有關MongoDB的正則表達式如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

不同于文本搜索,我們不需要做任何配置或命令就能直接使用正則表達式。

考慮下包含文字后其標簽的帖子集合,文檔結構如以下:

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

使用正則表達式表達

下面的正則表達式查詢搜索所有包含字符串 yiibai.com 的帖子:

復制代碼 代碼如下:


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

同樣的查詢也可以寫為:

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

使用正則表達式不區分大小寫

為了使搜索不區分大小寫,我們使用$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" ]
}

使用正則表達式的數組元素:

我們還可以使用數組字段正則表達式概念。 這時候我們實現標簽的功能顯得尤為重要。 所以,如果想要搜索帶有標簽以詞組tutorial開始所有的帖子(無論是tutorial或tutorials或tutorialjava或tutorialphp),都可以使用下面的代碼:

復制代碼 代碼如下:


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

優化正則表達式查詢:

如果文檔字段已被索引,查詢將使用使用索引值的匹配正則表達式。 這使得搜索非常快,正則表達式相對于掃描整個集合。

如果正則表達式是一個前綴表達式,所有的匹配是以某一串字符開始。例如,如果正則表達式 ^tut, 查詢有只搜索那些開始串 tut.

mongodb正則表達式應用

mongodb中完全支持正則表達式,一般查詢中可以使用操作符$regex

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

以上兩種完全等價,可以直接對域(field)即上例中的'name'鍵,使用正則表達式或者使用操作符,可選項目是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的正則表達式僅支持i和m的javascript原生寫法(如/*.lnmopy.com/i)。如果要是用x和s選項就必須使用“$regex”操作符并在“$options”中指定選項。

使用正則表達式的更新操作:

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語句。

正則表達式替換查詢結果中','為”

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的開發團隊)是由oracle出來的這點,就一點也不奇怪了。

看完上述內容,你們對MongoDB的正則表達式如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延吉市| 朝阳县| 巴林右旗| 金阳县| 津南区| 西充县| 永城市| 冀州市| 屏山县| 丰宁| 启东市| 武山县| 故城县| 获嘉县| 资兴市| 班玛县| 陈巴尔虎旗| 长春市| 义乌市| 大丰市| 永吉县| 皋兰县| 重庆市| 云阳县| 海门市| 正蓝旗| 福海县| 綦江县| 五原县| 定西市| 正阳县| 绥化市| 宣汉县| 朝阳区| 长葛市| 乌拉特前旗| 台湾省| 柳河县| 永州市| 马关县| 宜良县|