MongoDB學(xué)習(xí) (五):查詢操作符(Query Operators).1st

本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html歡迎轉(zhuǎn)載 集晚,請(qǐng)保留此鏈接??? ????啃洋!

查詢操作符(Query Operators)可以讓我們寫出復(fù)雜查詢條件十办,讓我們使用的過程更加靈活磺浙。

官方文檔中使用的“field”單詞,RDBMS中是字段的意思,但是MongoDB作為文檔數(shù)據(jù)庫雕凹,使用的BSON格式作為數(shù)據(jù)存儲(chǔ)格式。field對(duì)應(yīng)key,我這里還是把他翻譯成“字段”而不是“鍵”请琳。若有不妥粱挡,請(qǐng)指出。

演示數(shù)據(jù):

我們將實(shí)際操作下俄精。先向集合inventory插入3條數(shù)據(jù)询筏,文檔內(nèi)容如下:

{"name":"t1","amount":16,"tags":[ "school", "book", "bag", "headphone", "appliances" ]}

{"name":"t2","amount":50,"tags":[ "appliances", "school", "book" ]}

{"name":"t3","amount":58,"tags":[ "bag", "school", "book" ]}

比較查詢操作符?Comparison Query Operators

$all

語法: { field: { $all: [ , ... ] }

field:文檔中鍵的名稱(不使用雙引號(hào))。

匹配那些指定鍵的鍵值中包含數(shù)組竖慧,而且該數(shù)組包含條件指定數(shù)組的所有元素的文檔嫌套。

db.inventory.find( { tags: { $all: [ "appliances", "school", "book" ] } } )

查詢出在集合inventory中tags鍵值包含數(shù)組,且該數(shù)組中包含appliances圾旨、school踱讨、book元素的所有文檔 ?,因此該查詢將匹配tags鍵值包含如下任意數(shù)組的所有文檔砍的。

[ "school", "book", "bag", "headphone", "appliances"]

["appliances", "school", "book" ]

執(zhí)行上面的查詢語句痹筛,

文檔中鍵值類型不是數(shù)組,也可以使用$all操作符進(jìn)行查詢操作廓鞠,如下例所示:

//查詢結(jié)果是相同的帚稠,匹配amount鍵值等于50的文檔db.inventory.find( { amount: {$all:[50]}} )

db.inventory.find( { amount:50}} )

$gt

語法:{field: {$gt: value} }

匹配鍵值大于指定值的所有文檔。

$gte

語法:{field: {$gte: value} }

匹配鍵值不小于指定值的所有文檔床佳。

$lt

語法:{field: {$lt: value} }

匹配鍵值小于指定值的所有文檔滋早。

$lte

語法:{field: {$lte: value} }

匹配鍵值不大于指定值的所有文檔。

//下面將查詢amount鍵值大于50的文檔:db.inventory.find( { amount: { $gt: 50} } )//下面將查詢amount鍵值不小于(大于等于)50的文檔:db.inventory.find( { amount: { $gte: 50} } )//下面將查詢amount鍵值小于50的文檔:db.inventory.find( { amount: { $lt: 50} } )//下面將查詢amount鍵值不大于(小于等于)50的文檔:db.inventory.find( { amount: { $lte: 50 } } )

$in

語法: { field: { $in: [, , ... ] } }

匹配鍵值等于指定數(shù)組中任意值的文檔砌们。類似sql中in.

$nin

語法: { field: { $nin: [ , ... ]} }

匹配鍵不存在或者鍵值不等于指定數(shù)組的任意值的文檔杆麸。

查詢出amount鍵值為16或者50的文檔:

db.inventory.find( { amount: { $in: [ 16, 50 ] } } )

//查詢出amount鍵值不為16或者50的文檔db.inventory.find( { amount: { $nin: [ 16, 50] } } )//查詢出qty鍵值不為16或50的文檔,由于文檔中都不存在鍵qty,所以返回所有文檔db.inventory.find( { qty: { $nin: [ 16, 50 ] } } )

$ne

語法: {field: {$ne: value} }

匹配鍵值不等于指定值的文檔浪感。

查詢出amount鍵值不等于58的文檔:

db.inventory.find( { amount: { $ne: 58} } )//$nin查詢結(jié)果相同db.inventory.find( { amount: { $nin: [58] } } )

邏輯查詢操作符 Logical Query Operators

$and

語法: { $and: [ { }, { } , ... , { } ] }

and指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組昔头,選擇出滿足該數(shù)組中所有表達(dá)式的文檔。and指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組影兽,選擇出滿足該數(shù)組中所有表達(dá)式的文檔减细。and操作符使用短路操作,若第一個(gè)表達(dá)式的值為“false”,余下的表達(dá)式將不會(huì)執(zhí)行赢笨。

//選擇name為“t1”,amount值小于50的文檔數(shù)據(jù)db.inventory.find({ $and: [ { name: "t1" }, { amount: { $lt:50 } } ] } )

對(duì)于下面使用逗號(hào)分隔符的表達(dá)式列表,MongoDB會(huì)提供一個(gè)隱式的$and操作:

//等同于{ $and: [ { name: "t1" }, { amount: { $lt:50 } } ] }db.inventory.find({ name: "t1" , amount: { $lt:50 }} )

$nor

語法: { $nor: [ { }, { }, ... { } ] }

$nor執(zhí)行邏輯NOR運(yùn)算,指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組驮吱,選擇出都不滿足該數(shù)組中所有表達(dá)式的文檔茧妒。

//選擇name不為“t1”,amount值不小于50的文檔數(shù)據(jù)db.inventory.find( { $nor: [ { name: "t1" }, { qty: { $lt: 50 } } ] } )

//若是文檔中不存在表達(dá)式中指定的鍵,表達(dá)式值為false; false nor false 等于 true,所以選擇集合所有文檔db.inventory.find( { $nor: [ { sale:true}, { qty: { $lt: 50 } } ] } )

$not

語法: { field: { $not: { } } }

$not執(zhí)行邏輯NOT運(yùn)算左冬,選擇出不能匹配表達(dá)式的文檔 桐筏,包括沒有指定鍵的文檔。

$not操作符不能獨(dú)立使用拇砰,必須跟其他操作一起使用(除$regex)梅忌。

//選擇amount值不大于50的文檔數(shù)據(jù)db.inventory.find( { amount: { $not: { $gt: 50 } } } )

//指定的鍵gty狰腌,文檔中都不存在無法匹配表示,所以返回集合所有文檔數(shù)據(jù)牧氮。db.inventory.find( { gty: { $not: { $gt: 50 } } } )

$or

語法: { $or: [ { }, { }, ... , { } ] }

$or執(zhí)行邏輯OR運(yùn)算,指定一個(gè)至少包含兩個(gè)表達(dá)式的數(shù)組琼腔,選擇出至少滿足數(shù)組中一條表達(dá)式的文檔。

//選擇amount的鍵值大于50或者name的鍵值為t1的文檔db.inventory.find( { $or: [ { amount: { $gt: 50 } }, { name: "t1" } ] } )

元素查詢操作符 Element Query Operators

$exists

語法: { field: { $exists: } }

如果$exists的值為true,選擇存在該字段的文檔踱葛;若值為false則選擇不包含該字段的文檔丹莲。

//查詢不存在qty字段的文檔(所有文檔)db.inventory.find( { qty: { $exists:false} })//查詢amount字段存在,且值不等于16和58的文檔db.inventory.find( { amount: { $exists:true, $nin: [ 16, 58 ] } } )

如果該字段的值為null尸诽,$exists的值為true會(huì)返回該條文檔甥材,false則不返回。

//向集合中插入一條amount鍵值為null的文檔{"name":"t4","amount":null,"tags":[ "bag", "school", "book"]}//0條數(shù)據(jù)db.inventory.find( { amount: { $exists:false} } )//所有的數(shù)據(jù)db.inventory.find( { amount: { $exists:true} } )

$mod

語法: { field: { $mod: [ divisor, remainder ]} }

匹配字段值對(duì)(divisor)取模性含,值等于(remainder)的文檔洲赵。

//選擇集合中 amount 字段的值為 4 的 0 次模數(shù)的所有文檔,例如 amount 值等于 16 的文檔db.inventory.find( { amount: { $mod: [ 4, 0 ] } } )

有些情況下商蕴,我們可以使用mod操作符替代使用求模表達(dá)式的mod操作符替代使用求模表達(dá)式的where操作符叠萍,因?yàn)楹笳叽鷥r(jià)昂貴。

db.inventory.find( { $where: "this.amount % 4 == 0" } )

注意:返回結(jié)果怎么不一樣究恤。因?yàn)橛幸粭l文檔的amount鍵值為null,javascript中null進(jìn)行數(shù)值轉(zhuǎn)換俭令,會(huì)返回。所以該條文檔匹配where操作符求模式了表達(dá)式部宿。當(dāng)文檔中字段值不存在null抄腔,就可以使用where操作符求模式了表達(dá)式。當(dāng)文檔中字段值不存在null理张,就可以使用mod替代$where的表達(dá)式.

$type

語法: { field: { $type: } }

選擇字段值為指定的BSON數(shù)據(jù)類型的文檔.使用下面類型對(duì)應(yīng)的編號(hào):

類型類型編號(hào)

Double雙精度1

String字符串2

Object對(duì)象3

Array數(shù)組4

Binary data二進(jìn)制對(duì)象5

Object id對(duì)象id7

Boolean布爾值8

Date日期9

Null未定義10

Regular Expression正則表達(dá)式11

JavaScriptJavaScript代碼13

Symbol符號(hào)14

JavaScript (with scope)JavaScript代碼(帶范圍)15

32-bit integer32 位整數(shù)16

Timestamp時(shí)間戳17

64-bit integer64 位整數(shù)18

Min key最小鍵255

Max key最大鍵127

如果文檔的鍵值是一個(gè)數(shù)組赫蛇。那么$type將對(duì)數(shù)組里面的元素進(jìn)行類型匹配而不是鍵值數(shù)組本身。

db.inventory.find( { tags: { $type : 4} } )//如果想檢查鍵值的類型是否為數(shù)組類型雾叭,使用$where操作符db.inventory.find( { $where : "Array.isArray(this.tags)" } )

下面例子展示了文檔中類型(包括MinKey 和MaxKey):

db.type.insert( {x : 3});

db.type.insert( {x :2.9} );

db.type.insert( {x :newDate()} );

db.type.insert( {x :true} );

db.type.insert( {x : MaxKey } )

db.type.insert( {x : MinKey } )>db.type.find()

{"_id" : ObjectId("5185f9cfa1adf7d5f458505e"), "x" : 3}

{"_id" : ObjectId("5185f9cfa1adf7d5f458505f"), "x" : 2.9}

{"_id" : ObjectId("5185f9cfa1adf7d5f4585060"), "x" : ISODate("2013-05-05T06:18:

55.751Z") }

{"_id" : ObjectId("5185f9cfa1adf7d5f4585061"), "x" :true}

{"_id" : ObjectId("5185f9cfa1adf7d5f4585062"), "x" : { "$maxKey" : 1} }

{"_id" : ObjectId("5185f9d0a1adf7d5f4585063"), "x" : { "$minKey" : 1 } }

要查詢的字段值為MinKey悟耘,使用下面的語法:

db.collection_name.find( { field: { $type: -1 } } )

JavaScript查詢操作符 ?JavaScript Query Operators

$regex

regex操作符查詢中可以對(duì)字符串的執(zhí)行正則匹配。MongoDB使用Perl兼容的正則表達(dá)式(PCRE)庫來匹配正則表達(dá)式.可以使用正則表達(dá)式對(duì)象或者regex操作符查詢中可以對(duì)字符串的執(zhí)行正則匹配织狐。MongoDB使用Perl兼容的正則表達(dá)式(PCRE)庫來匹配正則表達(dá)式.可以使用正則表達(dá)式對(duì)象或者regex操作符.

//查詢name鍵值以“4”結(jié)尾的文檔db.inventory.find( { name: /.4/i } );

db.inventory.find( { name: { $regex:'.4', $options: 'i' } } );

options(options(regex 提供四個(gè)選項(xiàng)標(biāo)志)

i ? 如果設(shè)置了這個(gè)修飾符暂幼,模式中的字母會(huì)進(jìn)行大小寫不敏感匹配。

m ? 默認(rèn)情況下移迫,PCRE 認(rèn)為目標(biāo)字符串是由單行字符組成的(然而實(shí)際上它可能會(huì)包含多行).如果目標(biāo)字符串 中沒有 "\n"字符旺嬉,或者模式中沒有出現(xiàn)“行首”/“行末”字符,設(shè)置這個(gè)修飾符不產(chǎn)生任何影響厨埋。

s ? ?如果設(shè)置了這個(gè)修飾符邪媳,模式中的點(diǎn)號(hào)元字符匹配所有字符,包含換行符。如果沒有這個(gè)修飾符雨效,點(diǎn)號(hào)不匹配換行符迅涮。

x ? ?如果設(shè)置了這個(gè)修飾符,模式中的沒有經(jīng)過轉(zhuǎn)義的或不在字符類中的空白數(shù)據(jù)字符總會(huì)被忽略徽龟,并且位于一個(gè)未轉(zhuǎn)義的字符類外部的#字符和下一個(gè)換行符之間的字符也被忽略叮姑。 這個(gè)修飾符使被編譯模式中可以包含注釋。 注意:這僅用于數(shù)據(jù)字符顿肺。 空白字符 還是不能在模式的特殊字符序列中出現(xiàn)戏溺,比如序列 。

注:JavaScript只提供了i和m選項(xiàng)屠尊,x和s選項(xiàng)必須使用$regex操作符旷祸。

$where

$where操作符功能強(qiáng)大而且靈活,他可以使用任意的JavaScript作為查詢的一部分,包含JavaScript表達(dá)式的字符串或者JavaScript函數(shù)讼昆。

最典型的應(yīng)用就是比較文檔中的兩個(gè)鍵的值是否相等.

//插入兩條數(shù)據(jù)db.fruit.insert({"apple":1, "banana": 4, "peach" : 4})

db.fruit.insert({"apple":3, "banana": 3, "peach" : 4})

查找出banana等于peach鍵值的文檔(4種方法):

//字符串形式db.fruit.find( { $where: "this.banana == this.peach"} )

db.fruit.find( { $where:"obj.banana == obj.peach"} )//函數(shù)形式db.fruit.find( { $where:function() {return(this.banana ==this.peach) } } )

db.fruit.find( { $where:function() {returnobj.banana == obj.peach; } } )

查出文檔中存在的兩個(gè)鍵的值相同的文檔托享。

>db.fruit.find({$where:function() {for(varcurrentinthis) {for(varotherinthis) {if(current != other &&this[current] ==this[other]) {returntrue;

}

}

}returnfalse;

}});

不是非常必要時(shí),一定要避免使用"Where"査詢浸赫,因?yàn)樗鼈冊谒俣壬弦瘸R?guī)査詢慢很多闰围。每個(gè)文檔都要從BSON轉(zhuǎn)換成JavaScript對(duì)象,然后通過"Where"査詢既峡,因?yàn)樗鼈冊谒俣壬弦瘸R?guī)査詢慢很多羡榴。每個(gè)文檔都要從BSON轉(zhuǎn)換成JavaScript對(duì)象,然后通過"where"的表達(dá)式來運(yùn)行运敢。同樣還不能利用索引校仑。所以,只在走投無路時(shí)才考慮"$where"這種用法传惠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迄沫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卦方,更是在濱河造成了極大的恐慌羊瘩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盼砍,死亡現(xiàn)場離奇詭異尘吗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浇坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門摇予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吗跋,你說我怎么就攤上這事。” “怎么了跌宛?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵酗宋,是天一觀的道長。 經(jīng)常有香客問我疆拘,道長蜕猫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任哎迄,我火速辦了婚禮回右,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漱挚。我一直安慰自己翔烁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布旨涝。 她就那樣靜靜地躺著蹬屹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪白华。 梳的紋絲不亂的頭發(fā)上慨默,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音弧腥,去河邊找鬼厦取。 笑死,一個(gè)胖子當(dāng)著我的面吹牛管搪,可吹牛的內(nèi)容都是我干的虾攻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼抛蚤,長吁一口氣:“原來是場噩夢啊……” “哼台谢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岁经,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤朋沮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缀壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樊拓,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年塘慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筋夏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图呢,死狀恐怖条篷,靈堂內(nèi)的尸體忽然破棺而出骗随,到底是詐尸還是另有隱情,我是刑警寧澤赴叹,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布鸿染,位于F島的核電站,受9級(jí)特大地震影響乞巧,放射性物質(zhì)發(fā)生泄漏涨椒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一绽媒、第九天 我趴在偏房一處隱蔽的房頂上張望蚕冬。 院中可真熱鬧,春花似錦是辕、人聲如沸囤热。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赢乓。三九已至,卻和暖如春石窑,著一層夾襖步出監(jiān)牢的瞬間牌芋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工松逊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺屁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓经宏,卻偏偏與公主長得像犀暑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烁兰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 目錄 查詢操作 集合查詢方法 find() 查詢內(nèi)嵌文檔 查詢操作符(內(nèi)含 數(shù)組查詢) "$gt" 耐亏、"$gte"...
    彩虹之夢閱讀 1,011評(píng)論 0 1
  • 一 基本概念 MongoDB中數(shù)據(jù)的結(jié)構(gòu)為:庫、集合沪斟、文檔 1 數(shù)據(jù)庫 多個(gè)集合可以組成數(shù)據(jù)庫广辰。MongoDb的單...
    周東波_db閱讀 2,369評(píng)論 0 4
  • 一 基本概念及注意事項(xiàng) 1 MongoDB中數(shù)據(jù)的結(jié)構(gòu)為:庫、集合主之、文檔择吊,類似于關(guān)系型數(shù)據(jù)庫中的庫、表槽奕、行几睛,只...
    周東波_db閱讀 2,765評(píng)論 0 2
  • 關(guān)于operators 官方參考文檔:https://docs.mongodb.org/manual/refere...
    我看不見閱讀 2,491評(píng)論 0 3
  • 查詢數(shù)組很容易所森,對(duì)于數(shù)組囱持,我們可以這樣理解:數(shù)組中每一個(gè)元素都是這個(gè)鍵值對(duì)鍵的一個(gè)有效值,如下面的例子:我們要查詢...
    yzc123446閱讀 506評(píng)論 0 1