您好,登錄后才能下訂單哦!
一、普通查詢
find方法語法:
find([條件,需顯示的字段]);
注意:
1、如果沒有條件,則查詢全部
2、如果沒有顯示指定_id字段隱藏,則默認會顯示,顯示指定隱藏,如:find({},{"_id":0});
1.1、查看集合中所有的文檔
命令:db.集合名稱.find();
1.2、查看集合中第一個文檔
命令:db.集合名稱.findOne({條件對象});
1.3、指定需要返回的鍵
在find方法的第二個參數(shù)進行指定。默認情況下,始終會返回”_id”,可以通過設置字段為0來表示不返回這個字段。
二、條件查詢
find方法語法:
find([條件,需顯示的字段]);
在find方法里面加入條件數(shù)據(jù)即可,find方法的第一個參數(shù)就是。
注意:條件數(shù)據(jù)必須是常量值,不能是另外的字段的數(shù)據(jù)
1:比較操作
$lt:小于
$lte:小于等于
$gt:大于
$gte:大于等于
$ne:不等于
如:a、age小于20
> db.test1.find({"age":{$lt:20}});
b、age小于20,大于10
> db.test1.find({"age":{$lt:20,$gt:10}});
2:$and:包含多個條件,他們之間為and的關系
> db.test1.find({$and:[{"userId":2},{"username":"lisi"}]});
等價于下面:
> db.test1.find({"userId":2,"username":"lisi"});
3:$or :包含多個條件,他們之間為or的關系 ,$nor相當于or取反
操作方式與$and差不多
4:$not:用作其他條件之上,取反
> db.test1.find({"userId":{$not:{$ne:3}}}); > db.test1.find({"userId":{$not:/1/}});
5:$mod:將查詢的值除以第一個給定的值,如果余數(shù)等于等二個值則匹配成功
> db.test1.find({"age":{$mod:[100,3]}});
說明:
age除以100,如果余數(shù)為3,則滿足條件
6:$in :查詢一個鍵的多個值,只要鍵匹配其中一個即可 , $nin為不包含
> db.test1.find({"userId":{$in:[1,2]}});
7:$all:鍵需要匹配所有的值
> db.test1.find({"userId":{$all:[1,2]}});
8:$exists:檢查某個鍵是否存在,1表示存在,0表示不存在
> db.test1.find({"userId":{$exists:1}});
9:null類型:不僅能匹配鍵的值為null,還匹配鍵不存在的情況
> db.test1.find({"age":null});
三、正則表達式
MongoDB使用Perl兼容的正則表達式(PCRE),比如:
db.users.find({“name”:/sishuok/i}); 又比如:
db.users.find({“name”:/^sishuok/});
四、查詢數(shù)組
1:單個元素匹配,就跟前面寫條件一樣,{key:value}
> db.test1.find({"score":5});
2:多個元素匹配,使用$all, {key:{$all:[a,b]}},元素的順序無所謂
> db.test1.find({"score":{$all:[7,2]}});
3:可以使用索引指定查詢數(shù)組特定位置, {“key.索引號”:value}
> db.test1.find({"score.1":7});
4:查詢某個長度的數(shù)組,使用$size
> db.test1.find({"score":{$size:5}})
5:指定子集,使用$slice,正數(shù)是前面多少條,負數(shù)是尾部多少條,也可以指定偏移量和要返回的元素數(shù)量,比如:$slice:[50,10]
> db.test1.find({},{"score":{$slice:2}});
指定偏移量和要返回的元素數(shù)量,比如:偏移量1,返回兩個元素:
> db.test1.find({},{"score":{$slice:[1,2]}});
6:可以使用$來指定符合條件的任意一個數(shù)組元素,如:{”users.$”:1}
> db.test1.find({"score":{$in:[2,5]}},{"score.$":1});
7:$elemMatch:要求同時使用多個條件語句來對一個數(shù)組元素進行比較判斷
> db.test1.find({"score":{$gt:5,$lt:4}}); { "_id" : ObjectId("5925a29652b61a20c53dfd48"), "score" : [ 7 ] } >
說明:上面語句并不是我們想要的,“大于5,小于4”,應該是不存在的,這里如果想讓其生效,相當于and,則使用:$elemMatch
> db.test1.find({"score":{$elemMatch:{$gt:5,$lt:4}}}); >
五、查詢內嵌文檔
1:查詢整個內嵌文檔與普通查詢是一樣的
2:如果要指定鍵值匹配,可以使用“.” 操作符,比如:{“name.first”:”a”,“name.last”:”b”}
> db.test1.find({"user.id":1}); { "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } } >
3:如果要正確的指定一組條件,那就可能需要使用$elemMatch,以實現(xiàn)對內嵌文檔的多個鍵進行匹配操作
只有內嵌文檔中的有key的值是數(shù)組
注意:內嵌文檔的查詢必須要整個文檔完全匹配
4:$where查詢
在查詢中執(zhí)行任意的JavaScript,通過編程來解決查詢的匹配問題,方法返回boolean值。
> function t1() { ... for(var a in this) { ... if (a.userId==2) { ... return true; ... } ... } ... return false; ... }; > db.test1.find({$where:t1});
如果返回true,文檔作為結果的一部分被返回;如果為false,則不會返回。
使用的時候:db.users.find({"$where":t1});
注意:$where性能較差,安全性也是問題,所以不到萬不得已,不要使用
還可以這樣:
> db.test1.find({$where:"this.userId==1"});
六、分頁與其它相關
6.1、查詢記錄條數(shù)的命令:count
1:直接使用count()的話,得到的是整個記錄的條數(shù)
> db.test1.find().count(); 4
2:如果要獲取按條件查詢后記錄的條數(shù),需要指定count(true或者非0的數(shù))
> db.test1.find().limit(2).count(); 4 > db.test1.find().limit(2).count(1); 2 >
6.2、限制返回的記錄條數(shù)的命令:limit(要返回的條數(shù))
> db.test1.find().limit(2); { "_id" : ObjectId("5925a29652b61a20c53dfd48"), "userId" : "1", "age" : 13, "score" : [ 7, 7, 2, 5, 4 ] } { "_id" : ObjectId("5925a2a552b61a20c53dfd49"), "user" : { "id" : 1, "username" : "zhangsan" } } >
6.3、限制返回的記錄條數(shù)起點的命令:skip(從第幾條開始返回)
> db.test1.find().skip(2).limit(2); { "_id" : ObjectId("5926b15e52b61a20c53dfd4a"), "user" : { "id" : 2, "username" : "lisi" } } { "_id" : ObjectId("5926b6ce31e6d30b1b5084cd"), "userId" : 5, "name" : "zhangsan" } >
6.4、排序的命令:sort({要排序的字段:1為升序,-1為降序})
> db.test1.find().sort({"userId":1});
對多個字段進行排序:
> db.test1.find().sort({"userId":1,"username":1});
MongoDB處理不同類型的數(shù)據(jù)是有一定順序的,有時候一個鍵有多種類型的值,其排序順序是預先定義好的,從小到大如下:
(1)最小值 (2)null (3)數(shù)字 (4)字符串
(5)對象/文檔 (6)數(shù)組 (7)二進制數(shù)據(jù) (8)對象id
(9)布爾類型 (10)日期型 (11)時間戳 (12)正則表達式
(13)最大值
6.5、分頁查詢:組合使用limit,skipt和sort
數(shù)據(jù)量比較小時,建議使用;當數(shù)據(jù)量比較大時,建議使用其他方式來分頁,比如采用自定義的id,然后根據(jù)id來分頁
skipt的檢索方式:如果有100條數(shù)據(jù),我想要第59條,那么skipt也會檢索出前面58條,只是在第59條時返回。
6.6、查詢給定鍵的所有不重復的數(shù)據(jù),命令:distinct
語法:db.runCommand({“distinct”:集合名,“key”:”獲得不重復數(shù)據(jù)的字段”});
> db.runCommand({"distinct":"test1","key":"userId"}); { "values" : [ "1", 5 ], "ok" : 1 }
七、游標
1:獲取游標,示例如下:
> var c = db.test1.find();
2:循環(huán)游標,可以用集合的方式,示例如下:
> while(c.hasNext()){ ... printjson(c.next()); ... }
3:也可以使用forEach來循環(huán),示例如下:
> c.forEach(function(obj){ ... printjson(obj); ... });
效果:
八、存儲過程
1:MongoDB的存儲過程其實就是個自定義的js函數(shù)
> var addf = function(a,b){ ... return a+b; ... } >
2:使用db.system.js.save({“_id”:名稱,value:函數(shù)})存儲函數(shù);
> db.system.js.save({"_id":"myF","value":addf});
3:可以通過如下命令查看:db.system.js.find();
4:可以通過如下命令調用:db.eval(名稱);
注意:盡量避免使用游標與游標
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。