亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

MongoDB正則表達式及應用

2020-01-20 22:08:22
字體:
來源:轉載
供稿:網友

正則表達式常用來在所有語言中搜索字符串的任何模式或文字。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" : "{ "_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" : "{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "demo.lnmopy.com", "site" : "{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "welcome.lnmopy.com", "site" : "

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线电影av不卡网址| 国产精品免费一区二区三区都可以| 欧美做受高潮电影o| 色先锋久久影院av| 国产精品第2页| 亚洲第一福利视频| 欧美精品18videos性欧| 久久久噜噜噜久久中文字免| 国产精品最新在线观看| 久久精品在线视频| 97视频免费在线看| 久久久天堂国产精品女人| 亚洲男人天堂九九视频| 成人亚洲激情网| 日韩中文字幕精品视频| 欧美日韩国产一区在线| 亚洲最新av在线| 国产精品第三页| 欧美www在线| 亚洲国产成人爱av在线播放| 一区二区三欧美| 成人动漫网站在线观看| 91精品国产高清久久久久久91| 国产精品国产三级国产aⅴ浪潮| 欧美亚洲另类制服自拍| 国产一区二区三区直播精品电影| yw.139尤物在线精品视频| 日韩欧美成人精品| 日韩免费av在线| 国产精品成人v| 午夜精品一区二区三区视频免费看| 91免费看视频.| 欧美精品videosex极品1| 久久久免费精品| 91在线免费看网站| 亚洲二区中文字幕| 亚洲欧美日本伦理| 久久亚洲国产精品成人av秋霞| 97人洗澡人人免费公开视频碰碰碰| 精品久久香蕉国产线看观看gif| 色综合色综合网色综合| 欧美国产在线电影| 91po在线观看91精品国产性色| 最近2019中文字幕第三页视频| 国产美女高潮久久白浆| 国产在线精品自拍| 精品久久久久久中文字幕| 超碰日本道色综合久久综合| 一区二区亚洲欧洲国产日韩| 日韩中文字幕网址| 国产va免费精品高清在线| 久久人人爽人人爽人人片av高清| 欧美激情乱人伦一区| 亚洲黄在线观看| 精品中文字幕乱| 国产偷亚洲偷欧美偷精品| 欧美性xxxxx极品娇小| 欧美性猛交xxxxx水多| 51视频国产精品一区二区| 91精品国产综合久久香蕉最新版| 欧美成年人视频网站| 国产精品高潮呻吟久久av无限| 久久久国产精彩视频美女艺术照福利| 最新69国产成人精品视频免费| 色偷偷亚洲男人天堂| 日韩美女毛茸茸| 亚洲日本aⅴ片在线观看香蕉| 在线看国产精品| 成人网在线免费看| 69**夜色精品国产69乱| 亚洲福利小视频| 欧美亚洲国产日本| 欧美成人性生活| 国产精品入口夜色视频大尺度| 国产成人亚洲精品| 91久久在线播放| 韩国美女主播一区| 亚洲欧美国产精品久久久久久久| 91国内精品久久| 伊人久久久久久久久久久| 国产精品久久久久久久av大片| 色偷偷噜噜噜亚洲男人| 热门国产精品亚洲第一区在线| 国产精品吴梦梦| 亚洲综合中文字幕在线观看| 26uuu国产精品视频| 97超级碰碰人国产在线观看| 热久久免费视频精品| 亚洲一区二区久久久久久久| 精品国产一区二区三区久久狼5月| 最好看的2019的中文字幕视频| 久久久久久久电影一区| 久久国产视频网站| 久久久久久噜噜噜久久久精品| 欧美精品videos另类日本| 91精品久久久久久| 亚洲男子天堂网| 亚洲欧美第一页| 孩xxxx性bbbb欧美| 国产成人一区三区| 欧美一区二区.| 久久久久久久网站| 一本色道久久综合狠狠躁篇的优点| 久久久久久国产精品美女| 在线色欧美三级视频| 欧美成人久久久| 欧美精品18videos性欧美| 亚洲精品资源美女情侣酒店| 日韩av影视在线| 国产免费一区视频观看免费| 亚洲精品国精品久久99热| 欧美精品九九久久| 国产精品中文字幕在线| 国产精国产精品| 成人中文字幕+乱码+中文字幕| 欧美做受高潮电影o| 久久久av亚洲男天堂| 久久久久久久久久婷婷| 亚洲欧美国产精品va在线观看| 亚洲国产精品久久久久秋霞蜜臀| 欧美性理论片在线观看片免费| 国产精品伦子伦免费视频| 26uuu日韩精品一区二区| 日韩精品免费综合视频在线播放| 日韩经典中文字幕在线观看| 最好看的2019年中文视频| 日韩精品免费综合视频在线播放| 欧美激情视频播放| 热久久99这里有精品| 国产精品美女呻吟| 一区三区二区视频| 久久网福利资源网站| 91高清免费视频| 欧美一级淫片aaaaaaa视频| 中文字幕亚洲综合久久筱田步美| 国产成人激情小视频| 国产91久久婷婷一区二区| 欧美日韩国产一区二区| 波霸ol色综合久久| 亚洲精品综合精品自拍| 亚洲欧美国产精品va在线观看| 一区二区三区视频在线| 国产精品专区第二| 亚洲大尺度美女在线| 欧美成人亚洲成人日韩成人| 欧美精品videosex牲欧美| 欧美日韩在线视频一区| 欧美一区三区三区高中清蜜桃| 色99之美女主播在线视频| 久久久国产一区二区三区| 欧美猛交免费看| 成人激情av在线| 亚洲少妇激情视频| 久久久久久成人| 亚洲最大av网| 欧美激情精品久久久久久黑人| 久久精品国产一区二区三区| 亚洲女同性videos| 色与欲影视天天看综合网| 国产精品a久久久久久| 欧美高清电影在线看| 亚洲精品视频二区| 久久99久久99精品中文字幕| 欧美性色19p|