游标
- 查询操作返回的结果游标
- 游标的迭代与操作
db.collecton.find() 返回一个文档集合游标,在不迭代游标的情况下,只列出前20个文档;
个人理解,游标就是一个迭代器,里面存放了多个文档信息.
-
生命周期
游标会在遍历完所有文档后或者10分钟后关闭
可以使用noCursorTimeout()函数来保持游标一直有效,开发中如果使用,记得主动关闭游标
var cursor = db.accounts.find().noCursorTimeout();
cursor.close();
- 查看游标结构
var cursor = db.accounts.find();
cursor
- 使用游标下标直接访问文档集合中的某一个文档
var cursor = db.accounts.find();
cursor[0]
- 游标函数
method | 描述 |
---|---|
hasNext | 判断是否存在未游历到的文档,返回值为boolean |
next | 读取下一个文档集合中的文档 |
forEach | 遍历,学过java的都懂,这里我只能说懂得都懂 |
limit | 截断,传入一个数值,limit(5)就是只返回5条,limit(0)就是返回所有信息 |
skip | 跳过游标中的前n个文档,skip(5)就是跳过前5条 |
count | 统计游标中的文档数量,count中可以传入一个参数applySkipLimit。 语法结构为: count<applySkipLimit> 默认情况下,applySkipLimit为false,即count不会考虑skip和limit的限制条件. 不提供筛选条件的情况下,MongoDB会从Metadata中取得结果 当数据库分布式结构较为复杂的时候,此函数的结果可能是不准确的,考虑使用聚合管道 |
sort | 对游标中的文档进行排序,语法结构:sort(<document>) document为排序的要求:{ field: ordering },其中1为ASC,-1为DESC |
- 使用迭代器遍历游标中的文档
var cursor = db.accounts.find();
while ( cursor.hasNext() ){
var data = cursor.next();
printjson(data);
}
- 使用forEach遍历游标中的文档
var cursor = db.accounts.find();
cursor.forEach(printjson);
- 读取游标中第0条到第10条的文档信息
var cursor = db.accounts.find();
cursor.limit(10);
- 读取游标中第10条到第5条的文档信息
var cursor = db.accounts.find();
cursor.skip(10).limit(5);
- 统计游标中的文档数量
var cursor = db.accounts.find().skip(5).limit(5);
cursor.count(true);
- 查询游标中的文档信息,按name为ASC,balance为DESC的排序进行返回
db.accounts.find( {balance: { $exists: true} } ).sort( { balance: -1,name: 1 } );
- 查询游标中balance最大的文档信息
db.accounts.find( {balance: { $exists: true} } ).sort( { balance: -1} ).limit(1);
- 测试函数执行顺序,这里我们可以看到,执行顺序为 sort>skip>limit
db.accounts.find( {balance: { $exists: true} } ).limit(1).sort( { balance: -1} ).skip(1);
网友评论