麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Regex > 正文

MongoDB正則表達(dá)式及應(yīng)用

2020-03-16 21:02:21
字體:
供稿:網(wǎng)友
mongodb中完全支持正則表達(dá)式,一般查詢中可以使用操作符$regex,本文主要給大家介紹MongoDB正則表達(dá)式及應(yīng)用,介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下
 

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

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

考慮下包含文字后其標(biāo)簽的帖子集合,文檔結(jié)構(gòu)如以下:
 

  1.  "post_text""enjoy the mongodb articles on yiibai"
  2.  "tags": [ 
  3.   "mongodb"
  4.   "yiibai" 
  5.  ] 
?

使用正則表達(dá)式表達(dá)

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

 

復(fù)制代碼代碼如下:

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

 

同樣的查詢也可以寫為:

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

使用正則表達(dá)式不區(qū)分大小寫

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

 

復(fù)制代碼代碼如下:

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

 

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

  1.  "_id" : ObjectId("53493d37d852429c10000004"), 
  2.  "post_text" : "hey! this is my post on Yiibai",  
  3.  "tags" : [ "yiibai" ] 
  4. }  
?

使用正則表達(dá)式的數(shù)組元素:

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

 

復(fù)制代碼代碼如下:

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

 

優(yōu)化正則表達(dá)式查詢:

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

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

mongodb正則表達(dá)式應(yīng)用

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

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

以上兩種完全等價,可以直接對域(field)即上例中的'name'鍵,使用正則表達(dá)式或者使用操作符,可選項(xiàng)目是i,即忽略大小寫。
關(guān)于正則可選項(xiàng),mongodb和其他語言標(biāo)準(zhǔn)正則稍有不同,有自己的標(biāo)準(zhǔn)。

$options的可選值

i 忽略大小寫;

m 多行查找,如果內(nèi)容里面不存在換行符號(例如 /n)或者構(gòu)造上沒有(start/end),該選項(xiàng)沒有任何效果;
x 空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略,在未轉(zhuǎn)義的字符類之外的 # 以及下一個換行符之間的所有字符,包括兩頭,也都被忽略;

s 圓點(diǎn)元字符(.)匹配所有的字符,包括換行符

假設(shè)我們有一個數(shù)據(jù)庫名為mongoDemo

use mongoDemo

數(shù)據(jù)庫中有個集合名為lnmopy

db.lnmopy.find()

有如下數(shù)據(jù):

{ "_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的正則表達(dá)式僅支持i和m的javascript原生寫法(如/*.vevb.com/i)。如果要是用x和s選項(xiàng)就必須使用“$regex”操作符并在“$options”中指定選項(xiàng)。

使用正則表達(dá)式的更新操作:

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

意思是,查找當(dāng)前數(shù)據(jù)庫中名為“vevb”的集合中“name”字段符合“/*.vevb.com/i”正則的條目,并只將“site”字段更新為“www.companysz.com”,該條更新語句僅更新一條數(shù)據(jù),如果不是用$set,那么這條記錄就會只剩下你更新的部分和默認(rèn)的ObjectId,可以說是替換了。如果想替換所有,可以加入?yún)?shù):

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

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

我設(shè)計(jì)的字段“tag”有個缺陷,就是本來是一個單詞,現(xiàn)在每個字母都被“,“分隔開了。實(shí)際工作中也存在類似問題,由于批量轉(zhuǎn)換數(shù)據(jù),或者其他程序操作不當(dāng),或者業(yè)務(wù)需求更改等等原因需要對某些字段進(jìn)行正則批量處理,mongodb的一般更新方法是不能實(shí)現(xiàn)的,這時就需要使用javascript語句。

正則表達(dá)式替換查詢結(jié)果中','為”

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

最后執(zhí)行

db.lnmopy.find()

顯示如下數(shù)據(jù):

{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "www.companysz.com", "site" : "www.companysz.com", "tag" : "vevb"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "sucai.vevb.com", "site" : "www.companysz.com", "tag" : "sucai"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "idc.vevb.com", "site" : "www.companysz.com", "tag" : "idc"}

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久精品99久久久久久2456 | 久久国产免费 | 999精品国产 | 成人观看网站 | 鲁人人人鲁人人鲁精品 | 最新在线中文字幕 | 国产视频在线观看一区二区三区 | 一区二区三高清 | 欧美三级日本三级少妇99 | 日日草夜夜草 | 一级做a爱性色毛片免费1 | 午夜精品网站 | 国产成人av免费看 | 黄色免费小网站 | 国产一区国产二区在线观看 | 午夜视频在线 | av电影观看 | 欧美一区二区三区中文字幕 | 久久超| av免费在线观 | 一本色道久久综合狠狠躁篇适合什么人看 | 蜜桃网站在线观看 | 午夜爽爽爽男女免费观看hd | 久久国产精品99久久人人澡 | 久久久久久久久久久国产精品 | 久久久久久中文字幕 | 成人午夜视频在线观看 | 毛片大全在线观看 | 国产精品免费久久久久 | av亚洲在线观看 | 国产69精品久久久久9999不卡免费 | 亚洲福利视 | 亚洲天堂字幕 | 国产91一区二区三区 | 视频在线亚洲 | hd欧美free性xxxx护土 | 国产精品免费一区二区 | 日本一区二区不卡在线观看 | 亚洲欧美日韩久久精品第一区 | 国产二区三区四区 | 国产高清成人久久 |