您好,登錄后才能下訂單哦!
上一篇講完了mongodb的增、刪、改,本文就來講解他的強大的查詢功能。
一、find命令簡介及初探
在mongodb中的查詢使用的是find()命令。他2個參數,第一個參數是你的查詢條件(默認為{}表示查詢所有),第二個參數是指定你要返回的鍵(默認為{}表示返回所有)。下面我們將詳解find()命令:
初始數據:db.user.save({name:"zhangsan",age:26,sex:"women",num:[1,2,4],height:164})
db.user.save({name:"lisi",age:22,sex:"man",num:[2,3,4],height :null})
db.user.save({name:"wangwu",age:29,sex:"man"})
a.查詢user集合中所有的數據:db.user.find(),其實db.user.find()是db.user.find({})的簡寫,看著方便,舒服。
b.查詢name為lisi而且age為22的文檔:db.user.find({name:"lisi",age:22});
c.從返回的結果指定的返回鍵,查詢name為lisi且只返回age鍵:db.user.find({name:"lisi"},{age:1}),但是你會發現"_id"這個鍵總是會返回回來,即使你沒指定也一樣,你可以使用{"_id":0}來不讓其返回,如db.user.find({name:"lisi"},{age:1,"_id":0}).
d.指定返回結果中不希望有某些個鍵,如查詢name為lisi只不返回age這個鍵:db.user.find({name:"lisi"},{age:0}),其實和上一條差不多,只是相反。
在這里不得不說的就是findOne命令:他表示只返回結果中的第一條數據,如:
db.user.findOne();
二、深入了解find()里的各種查詢
$lt,$lte,$gt,$gte(條件句):他們分別對應的是:<,<=,>,>=。
例:查詢年齡在22到26歲(含)之間的數據:db.user.find({age:{$gte:22,$lte:26}})
$ne:ne也就是not equal ,說白點就是不等于。
例:查詢年齡不等于22的數據:db.user.find({age:{$ne:22}})
原文地址:http://1145004.blog.51cto.com/1135004/1265522
$in,$all,$nin(三個跟的是數組):這三個查詢操作可以接受一個到多個值的列表,也就是一個數組。
$in:和mysql的in關鍵字很像,也相當于mysql中的or關鍵字的意思,表示滿足這個數組之內的值之一都能查詢出來.
例:查詢name為zhangsan和lisi的數據:db.user.find({name:{$in:["zhangsan","lisi"]}})
$nin:這個就是not in的縮寫,與in相反,也就是不在該數組之內的值會被查詢出來。
例:db.user.find({name:{$nin:["zhangsan","wangwu"]}})將返回name為lisi的文檔,而不會返回name為zhangsan、wangwu的文檔。
$all:這個東西和$in很像,但$all要求必須滿足數組內所有的值。
例:db.user.find({num:{$all:[1,2]}})能查出{num:[1,2,4]}的文檔,而查不出{num:[2,3,4]}的文檔。
$or:因為$in等只能對單一個鍵進行查詢,而$or和mysql中的or差不多,對多個鍵進行或者查詢(只要滿足其一就能查詢出來),or后面跟的是一個數組。
例:查詢出name為"lisi"或者年齡為24的數據:db.user.find({$or:[{name:"lis"},{age:24}]})
$mod:表示取余。
例:db.user.find({age:{$mod:[5,1]}})表示將查詢age為1,6,11,16,21,26等用戶,這里就會查詢出age為26的用戶。
注(重):
1。條件句(如$lt)是內層文檔的鍵,修改器(如$set)是外層文檔的鍵。一個鍵可以有多個條件,但一個鍵不能對應多個更新修改器。如:db.user.update({name:"wangwu"},{$inc:{age:1},$set:{age:20}})這樣更新不成功,因為age鍵被修改了兩次。
2。$in,$all會用到索引,而$nin不會用到索引,故多優先推薦$in,$all使用。
null值的查詢:null是一個奇怪的東西。我們通過例子來查看,
例:我們要查詢出heigth為null的數據,db.user.find({height:null})你會發現返回的不光是{height:null}的值,還會返回沒有height鍵的文檔。如果僅想要匹配鍵值為null的,還須要用到$exists操作符。如db.user.find({height:{$in:[null],$exists:true}})就能只返回height為null的文檔了。注:由于mongodb無"$eq"操作符號,所以使用$in來代替。
正則表達示:能夠很靈活的匹配字符串,例如實現mysql中的like功能。
例:
查詢name以w開頭的數據:
db.user.find({name:/^w/});
查詢name 包括si的數據:
db.user.find({name:/si/});
查詢name 包括si或者SI的數據(也就是不區分大小寫):
db.user.find({name:/si/i}) ,i表示不區分大小寫。
三、數組:
前面的$in,$all都是用于數組的,前面講過了這里就不再解釋了。
$size:針對數組用的,可用于查詢指定數組的長度。
例:我要查詢出num的長度為3的數據,db.user.find({num:{$size:3}})
$slice:因為find第二個參數是指定返回的鍵,但$slice返回數組的一個子集合。讓我們通過例子來說明他的用法及作用。
例:
a.我想返回name為" zhangsan "中num數組的前兩個值:
db.user.find({name:" zhangsan "},{num:{$slice:2}}),就會返rsult的所有鍵且num數組只會返回前兩個元素[1,2]。
b.我想返回name為" zhangsan "中num數組的最后兩個值:
db.user.find({name:"zhangsan "},{num:{$slice:-2}}),就會返rsult的所有鍵且num數組只會返回前兩個元素[2,4]。
c.我想返回name為" zhangsan "中num數組的第二到第三個元素:
db.user.find({name:" zhangsan "},{num:{$slice:[1,3]}}),就會返rsult的所有鍵且num數組會跳過第一個元素而返回第二個和第三個元素[2,4]。
通過指定數組位置來查詢:
例:db.user.find({"num.1":3})表示查詢num數組的第二個位置值為3的文檔,即返回name為lisi的文檔。
統計一個文檔某一數組的長度(大小):
例:我們要得到name為zhangsan文檔中num組的長度,db.user.findOne({name:"zhangsan"}).num.length.
查詢內嵌文檔:
來兩條初始數據:db.user.save({name:"zangsan",age:22,stu:{name:"lidao",age:21}});
db.user.save({name:"lisi",age:23,stu:{name:"xiaodao",age:20}});
我們要查詢lisi的學生姓名為xiaodao的文檔:db.user.find({"stu.name":"xiaodao"})
注意:我們在使用內嵌查詢時在鍵上一定要加"",不然會報錯的,如"stu.name"正確,而stu.name會報錯誤。
四、游標:
mongodb使用游標來返回find的執行結果,因為游標類還實現了迭代器接口,所以還在可以在foreach中使用。
這里用一個簡單的例子來說明:
var result = db.user.find()
while(result.hasNext){
obj = result.next();
print(obj.name);
}
$where:有些需求無法滿足時,$where就出現了,用它可以執行任意js作為查詢的一部分,有了他幾乎能做任何事。
例:查詢年齡大于26的數據:
db.user.find({$where:"this.age> 26"})
他等同于:=>var f =function(){return this.age > 26;}
=>db.user.find(f)
$limit:限制返回結果用的,此外$limit指定的是上限而非下限,如果不夠就返回查詢到的全部。
例:我要返回user集合所有數組的前兩條,db.user.find().limit(2);
$skip:他配合$limit使用的,也可以單獨使用,且盡量避免過大量結果。我們通過例子說明。
例: db.user.find().skip(1);表示從第二條數據返回,也就是只返回name為lisi和wangwu的文檔。
db.user.find().skip(1).limit(1);表示從第二條數據返回且只返回第一條數據,即name為lisi的文檔。
注:$skip不適合作分頁使用,因為假如有一百萬數據,你就要略過大量結果,所以效率非常你,不適合作分頁。
$sort:對返回的結果進行排序。
例:db.user.find().sort({age:1}),表示將返回的結果按age鍵進行升序排列。
最后一個說明 distinct操作:表示獲取特定鍵中不同值列表的最簡單的工具。
例:db.user.find("name")他將返回["zhangsan","lisi","wangwu"]
注:distinct返回是有限制的,他的返回結果必須是16M。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。