MongoDB从零起步走之find下 - qianjiahao/MongoDB GitHub Wiki

###查询数组###

####$all#### 利用all来查询所以满足的匹配项,已知数据库有这些数据

db.user.find({},{"_id":0})

{ "fruit" : [ "apple", "banana", "cherry" ] }

{ "fruit" : [ "apple", "banana", "pear" ] }

{ "fruit" : [ "apple", "watermelon", "pear" ] }

需要查询出有apple和cherry的文档

db.user.find({"fruit":{$all:["apple","cherry"]}},{"_id":0})

{ "fruit" : [ "apple", "banana", "cherry" ] }

与之前的OR查询($or $in)相比,$all的查询模式更像是去取交集,即同时满足查询条件才能被查询出来。


####$size####

size可以获得指定数组长度的文档

db.user.find({"fruit":{"$size":3}},{"_id":0})

{ "fruit" : [ "apple", "banana", "cherry" ] }

{ "fruit" : [ "apple", "banana", "pear" ] }

{ "fruit" : [ "apple", "watermelon", "pear" ] }


###游标### 数据库使用游标来控制find的执行结果。

客户端对游标的实现通常能够对最终结果进行有效控制。

可以限制结果的数量,略过部分结果,对任意方向任意键的组合对结果进行排序,或者去执行一些功能强大的操作。

我们来看一例

var cursor = db.foo.find().sort({"x":1}).limit(3).skip(5)

上面代码的意思是:对foo集合查询文档,参照x键的值升序排序,仅显示跳过前五个后的前三个文档。

在接触过Jquery后,感觉这样的链式函数调用很眼熟。

其实他们的原理是一样的,因为几乎所有的游标对象的方法都会返回游标本身,

所以才可以使用如此优雅的方式去调用函数。

####注意#### 在调用find的时候,shell并不立即查询数据库,

而是等待正要获得结果的时候才发送查询,这样在执行之前可以给查询附加额外的选项。

####limit、sort和skip####

  • limit指的是上限
  • sort里 1 为升序,-1为降序,如果sort里有多个值,那就按照多个键的顺序,依次排序
  • skip...就是skip(额)

用这三个方法可以通常可以用来制作分页。


####辩证的看待游标#### 在服务器端,游标消耗内存和其他资源。

游标遍历尽了结果以后,或者客户端发来消息要求终止,数据库将会释放这些资源,释放掉的资源可以被数据库换作他用。

这非常有必要,所以尽量保证尽快释放资源(在合理的前提下)

还有一些情况导致游标终止

  • 首先,当游标完成了匹配结果的迭代时,它会清除自身。
  • 另外,当游标在客户端已不在作用域内时,驱动会向服务器发送专门的消息,让其销毁。
  • 最后,即便用户没有迭代完所有的结果,并且游标还在作用域内,10分钟不使用,数据库游标也会自动销毁。