好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MongoDB 查询操作的实例详解

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

查看更多关于MongoDB 查询操作的实例详解的详细内容...

  阅读:32次