Mongodb中find()函数返回一个游标,客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等。
hasNext
判断是否还有更多的文档
next
用来获取下一条文档
var cursor = db.foo.find()
while(cursor.hasNext()) {
print(cursor.next().name)
}
toArray
将查询结果放倒数组中
var cursor = db.foo.find({age: 22})
printjson(cursor.toArray())
count
集合中的文档数量
var cursor = db.foo.find()
cursor.count()
limit
限制结果数量
db.foo.find()limit(5)
skip
跳过指定数目的文档(略过过多的文档会导致性能问题)
db.foo.find().skip(2)
sort
接受键值对对象作为参数,键对应文档的键名,值代表排序方向(1为生序,-1为降序)
db.foo.find({age: 22}).sort({name: 1})
limit、skip、sort这3个方法可以组合使用,因为当调用find函数的时候,shell并不立即查询数据库,而是等真正开始获取结果时才发送请求。
下面几种表达时等价的:
var cursor = db.foo.find().sort({x: 1}).limit(3).skip(2)
var cursor = db.foo.find().limit(3).sort({x: 1}).skip(2)
var cursor = db.foo.find().skip(2).limit(3).sort({x: 1})
objsLeftInBatch
查看当前批次剩余的未被迭代的文档数量。
查询发往服务器,shell立即获取前100个结果或者前4MB数据(两者之中较小者),返回的文档会缓存在内存中,这样下次调用next或者hasNext时就不必再次连接服务器获取结果了。
如果不将find函数返回的游标赋值给一个局部变量进行保存的话,默认情况下游标会自动迭代20次。
cursor.objsLeftInBatch()
snapshot
对查询结果使用快照。
游标可能会返回那些由于体积变大而被移动到集合末尾的文档,使用快照,查询会在“_id”索引上遍历执行,这样可以确保每个文档只会被返回一次,从而保证获取结果的一致性。
db.foo.find().snapshot()
游标的生命周期
游标在完成匹配结果的迭代时,它会清除自身。
如果游标已经不在作用域内,驱动程序会向服务器发送一条特别消息,让其销毁游标。
如果一个游标在10分钟内没有使用的话,数据库游标也会自行销毁。
serverStatus查看当前系统的游标状态
db.serverStatus().metrics.cursor
/*
{
"timedOut" : NumberLong(0), //数据库启动以来超时的游标个数
"open" : {
"noTimeout" : NumberLong(0), //使用noTimeout阻止超时的游标个数
"pinned" : NumberLong(0), //打开的pinned类型的游标个数
"total" : NumberLong(0) //打开的游标总数
}
}
*/