遍历完游标中所有文档之后,或者10分钟之后,游标便会自动关闭,可以使用 noCursorTimeout() 函数来保持游标一直有效,之后不遍历游标的情况下你需要主动关闭游标 close()
var myCursor = db.accounts.find().noCursorTimeout()
myCursor.close()
游标函数
- cursor.hasNext() 是否有下一个
- cursor.next() 下一个
var myCursor = db.accounts.find({ name: "george" })
while( myCursor.hasNext() ) {
printjson(myCursor.next())
}
- cursor.forEach() 遍历
var myCursor = db.accounts.find({ name: "george" })
myCursor.forEach(printjson)
- cursor.limit() 传入数字 n,代表只输出 n 个文档,传入 0 相当于 limit 失效,数据全量返回。
- cursor.skip() 传入数字 n,代表跳过 n 个文档,输出别的
// 本来输出很多,现在只输出前两个
db.accounts.find({ name: "george" }).limit(2)
// 跳过第一个,从第二个开始输出
db.accounts.find({ name: "george" }).limit(1)
执行顺序:sort > skip > limit
执行时无论顺序怎么写,也先按这个顺序执行,所以为了不出现歧义,如果三个同时存在的时候要按顺序写
- cursor.count() 计数,参数默认为 false,表示忽略limit和skip的效果
// 比如本来有 3 个,使用 limit(2) 输出 2 个文档,使用 count() 输出 3
db.accounts.find({ name: "george" }).limit(2).count()
// 输出 2
db.accounts.find({ name: "george" }).limit(2).count(true)
- cursor.sort() 排序,参数 1(正序) 或 -1(倒序)
// 余额倒序,姓名正序
db.accounts.find().sort({
balance: -1,
name: 1
})