您好,登錄后才能下訂單哦!
3.查詢中null的處理
null的匹配非常有意思:null不僅僅會(huì)匹配到指定鍵的值確實(shí)等于null的文檔,并且還會(huì)匹配到查詢所制定鍵不存在的文檔。例如,插入下面這三個(gè)文檔:
> db.users.insert({"name":"Tom","age":20,"job":"Sales"}); > db.users.insert({"name":"Sam","age":25,"job":"Manager"}); > db.users.insert({"name":"Jim","age":25}); > db.users.insert({"name":"Sam","age":25,"job":null});
現(xiàn)在我們用傳統(tǒng)的方式來(lái)匹配job為null的文檔:
> db.users.find({"job":null});
結(jié)果如下:
{ "_id" : ObjectId("4f0714e3edb28db4864be582"), "name" : "Jim", "age" : 25 } { "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }
很明顯,不僅將job確實(shí)為null的文檔匹配出來(lái),而且將沒(méi)有job這個(gè)鍵的文檔匹配出來(lái)了。很多時(shí)候這并不是我們的本意。有一個(gè)$exists操作符可以來(lái)解決這個(gè)問(wèn)題。先看代碼:
db.users.find({"job":{"$in":[null],"$exists":true}});
結(jié)果如下:
{ "_id" : ObjectId("4f071542edb28db4864be583"), "name" : "Sam", "age" : 25, "job" : null }
4.正則表達(dá)式
MongoDB使用Perl兼容的正則表達(dá)式庫(kù)來(lái)匹配正則表達(dá)式。正則表達(dá)式本身非常強(qiáng)大,有專門寫(xiě)這個(gè)的書(shū),我這里不針對(duì)這個(gè),只是簡(jiǎn)單的舉個(gè)例子。例如,忽略大小寫(xiě)情況下匹配name為Tom的文檔:
db.users.find({"name":/tom/i});
5.數(shù)組查詢
數(shù)組查詢大的思路:大部分情況下,數(shù)組的每個(gè)元素都可以是對(duì)應(yīng)鍵的值。這么說(shuō)肯定不好理解,舉個(gè)例子,插入下面這樣一個(gè)文檔:
db.food.insert({"fruit":["apple","banana","peach"]});
現(xiàn)在執(zhí)行下面三個(gè)查詢,都會(huì)將這個(gè)文檔匹配出來(lái)。
db.food.find({"fruit":"apple"}); db.food.find({"fruit":"banana"}); db.food.find({"fruit":"peach"});
如果需要匹配fruit鍵的值既有apple又有banana的文檔,可以使用$all匹配符?,F(xiàn)在我們假設(shè)有下面幾個(gè)文檔:
{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] } { "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] } { "_id" : ObjectId("4f071c6076285076f80ca7c8"), "fruit" : [ "apple" ] } { "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] }
執(zhí)行下面的查詢:
db.food.find({"fruit":{"$all":["apple","banana"]}});
可以匹配到下面的三個(gè)文檔:
{ "_id" : ObjectId("4f071a10edb28db4864be584"), "fruit" : [ "apple", "banana", "peach" ] } { "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] } { "_id" : ObjectId("4f071ce576285076f80ca7c9"), "fruit" : [ "banana", "apple" ] }
你可能會(huì)說(shuō),可以采用精確匹配整個(gè)數(shù)組的方法如下:
db.food.find({"fruit":["apple","banana"]});
得到的結(jié)果只有一個(gè)文檔:
{ "_id" : ObjectId("4f071c5676285076f80ca7c7"), "fruit" : [ "apple", "banana" ] }
不用驚訝,這就是精確匹配,連apple和banana出現(xiàn)的順序都不能調(diào)換。這種結(jié)果很顯然不是很多時(shí)候我們想要的。也是為什么引進(jìn)$all匹配操作符。
還有一種匹配的語(yǔ)法:可以使用key.index來(lái)匹配指定鍵對(duì)應(yīng)值(是數(shù)組的情況下)的第index+1個(gè)元素值。還是上面水果的那個(gè)例子,我們假設(shè)要匹配fruit鍵對(duì)應(yīng)值第三個(gè)元素為peach的文檔,我們可以這么寫(xiě):
db.food.find({"fruit.2":"peach"});
注意一點(diǎn),數(shù)組下標(biāo)是從0開(kāi)始的。
如果我們需要匹配fruit鍵的值數(shù)組元素個(gè)數(shù)為3個(gè)的文檔,可以使用$size匹配操作符:
db.food.find({"fruit":{"$size":3}});
這樣也可以將第一個(gè)文檔匹配出來(lái)。但是特別需要注意,$size匹配符是不能和其他的查詢條件共同使用的。比如你按照下面寫(xiě)是不會(huì)有結(jié)果的:
db.food.find({"fruit":{"$gt":{"$size":2}}});
這是不會(huì)匹配出fruit鍵的值數(shù)組元素個(gè)數(shù)大于2的文檔。這樣不會(huì)有任何查詢結(jié)果的。
《MongoDB:The Definitive Guide》
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。