MongoDB 查询操作的实例详解
使用find或findOne进行查询。并可以进行范围查询、数据集查询、不等式查询,以及其他的一些查询。
查询将会返回DBcursor 游标只有在你需要的时候返回文档
针对游标返回的文档(结果集) 进行操作 例如:忽略一定数量的结果,或者返回结果的数量,以及对结果的排序。
1.指定需要返回的键
有时候仅仅对文档的某几个键值感兴趣,可以屏蔽返回的不感兴趣的键值,返回感兴趣的键值
1
2
3
4
5
6
7
8
|
mongos> db.blog.find({},{“ name ”:1})
{ “_id” : ObjectId(“5659836e73c8340448fa470e”) }
{ “_id” : ObjectId(“565e5c0e73c8340448fa470f”) }
{ “_id” : ObjectId(“565f998e73c8340448fa4710”) }
{ “_id” : 1, “ name ” : “zmkzmkzmkzmkzmk” }
{ “_id” : 2, “ name ” : “zmkzmkzmkzmkzmk” }
{ “_id” : 3, “ name ” : “zmkzmkzmkzmkzmk” }
{ “_id” : ObjectId(“566004d173c8340448fa4712”), “ name ” : “zmk” }
|
可以这样:
1
2
3
4
5
|
mongos> db.blog.find({},{“ name ”:1,”_id”:0})
{ “ name ” : “zmkzmkzmkzmkzmk” }
{ “ name ” : “zmkzmkzmkzmkzmk” }
{ “ name ” : “zmkzmkzmkzmkzmk” }
{ “ name ” : “zmk” }
|
指定返回的键值,是查询结果更高效。此接口可用于条件查询,方便结果处理。
2.查询条件
比较操作符
1
|
"$lt" 、 "$lte" 、“$gt”,“$gte” 分别对应 <,<=,>,>=。
|
小贴士:在mongodb shell中定义方法的大概格式:
1
2
3
4
5
6
|
mongos> var insertName= function (){
… for (var i=0;i<10;i++){
… db.blog. insert ({“_id”:1,” name ”:”zmk”+i})
… }
… }
mongos> insertName()
|
效果:
1
2
3
4
5
6
7
8
9
10
11
|
mongos> db.blog.find()
{ “_id” : 1, “ name ” : “zmk0” }
{ “_id” : 0, “ name ” : “zmk0” }
{ “_id” : 2, “ name ” : “zmk2” }
{ “_id” : 3, “ name ” : “zmk3” }
{ “_id” : 4, “ name ” : “zmk4” }
{ “_id” : 5, “ name ” : “zmk5” }
{ “_id” : 6, “ name ” : “zmk6” }
{ “_id” : 7, “ name ” : “zmk7” }
{ “_id” : 8, “ name ” : “zmk8” }
{ “_id” : 9, “ name ” : “zmk9” }
|
观察下面的效果,find可以使用“$lt”<来查询文件插入的时间
1
2
3
4
|
mongos> db.blog. insert ({“_id”:10,” time ”:new Date ()})
WriteResult({ “nInserted” : 1 })
mongos> db.blog.find({“ time ”:{“$lt”:new Date ()}})
{ “_id” : 10, “ time ” : ISODate(“2015-12-05T12:08:53.469Z”) }
|
3.查询数组
1.$all
应用于多个元素匹配数组,且并无顺序。
1
2
3
4
5
6
7
8
9
|
mongos> db.blog. insert ({“_id”:1,”fruit”:[“apple”,”banana”,”peach”]})
WriteResult({ “nInserted” : 1 })
mongos> db.blog. insert ({“_id”:2,”fruit”:[“apple”,”kumquat”,”orange”]})
WriteResult({ “nInserted” : 1 })
mongos> db.blog. insert ({“_id”:3,”fruit”:[“cherry”,”banana”,”apple”]})
WriteResult({ “nInserted” : 1 })
mongos> db.blog.find({“fruit”:{$ all :[“apple”,”banana”]}})
{ “_id” : 1, “fruit” : [ “apple”, “banana”, “peach” ] }
{ “_id” : 3, “fruit” : [ “cherry”, “banana”, “apple” ] }
|
对数组进行精确匹配,可以使用key.index语法指定下标
1
2
|
mongos> db.blog.find({“fruit.2”:”peach”})
{ “_id” : 1, “fruit” : [ “apple”, “banana”, “peach” ] }
|
2.$size
查询特定长度的数组。
1
2
3
4
|
mongos> db.blog.find({“fruit”:{$ size :3}})
{ “_id” : 1, “fruit” : [ “apple”, “banana”, “peach” ] }
{ “_id” : 2, “fruit” : [ “apple”, “kumquat”, “orange” ] }
{ “_id” : 3, “fruit” : [ “cherry”, “banana”, “apple” ] }
|
可以再存有数组的文档中添加size键,每一次向指定数组中添加元素,同时增加“size”的值,自增操作非常快,对性能不影响。
3.slice
可以返回某个键匹配的数组元素的一个子集
1
2
3
|
mongos> db.blog.find({“fruit”:{ size :3}},{ "fruit" :{"slice”:-2}})
{ “_id” : 2, “fruit” : [ “kumquat”, “orange” ] }
{ “_id” : 3, “fruit” : [ “banana”, “apple” ] }
|
4.查询内嵌文档
点语法即可
1
|
mongos>db.people.find({“ name . first ”:”Joe”,” name . last ”:”Schmoe”})
|
要正确的指定一组元素,而不必指定每个键,则需要使用$elemMatch 用来在查询条件中不非指定匹配数组中的单个内嵌文档。
1
2
3
|
db.blog.find({“comments”:{“$elemMatch”:
{“author”:”joe”,”score”:{“$gte”:5}}}})
|
5.limit、skip和sort
三个方法可以组合进行分页.
比如你有一个在线商店,有人搜索mp3,若想每页返回50个结果,而且按照价格从高到低升序排列。
1
2
3
|
db.stock.find({“des”:”mp3”}).limit(50).sort({“price”:-1})
db.stock.find({“des”:”mp3”}).skip(50).limit(50).sort({“price”:-1})
……
|
然而略过太多会导致性能问题。
解决方法:尽量避免使用skip略过大量结果。
1
2
3
4
5
6
7
8
|
var page1=db.stock.find({“des”:”mp3”}).limit(50).sort({“price”:-1})
var lastest= null ;//解决方法,将游标最后一个文档记录下来,成为第二次查询的条件的一部分
while(page1.hasNext()){
lastest=page1. next ();
display(lastest);
}
var page2=db.stock.find({“des”:”mp3”},{“price”:{$gt:lastest.price}}).limit(50).sort({“price”:-1})
……
|
随机选取文档
正确方法是在插入文档时插入一个随机值的键,然后按照普通查询进行find()即可。
感谢阅读,如有疑问请留言或者到本站社区交流讨论,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/qq_18149897/article/details/50338965