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分钟不使用,数据库游标也会自动销毁。