mongodb 游标 (学习笔记三)

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) //打开的游标总数
    }
}
*/
    原文作者:幸福镰刀
    原文地址: https://www.jianshu.com/p/c46c866de817
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞