MongoDB文档翻译-CRUD操作-在mongo Shell中迭代游标

英文原文地址:https://docs.mongodb.com/v3.2/tutorial/iterate-a-cursor/
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。

在mongo Shell中迭代游标

db.collection.find()方法返回一个游标。为了访问文档,需要对游标进行迭代。然后,在mongoshell中,如果游标没有赋值给用var定义的变量,游标会自动迭代20次直到终止,打印结果中前20个文档。

以下例子展示了各种方法来手动迭代游标或通过下标迭代来访问文档。

手动迭代游标

mongoshell中,当你把从find()方法返回的游标赋值给用var声明的变量时,游标不会自动迭代。

你可以使用游标变量,在shell中迭代直到20次,打印出匹配的文档,如下:

var myCursor = db.users.find( { type: 2 } );

myCursor

你也可以使用游标方法next()来访问文档,如下:

var myCursor = db.users.find( { type: 2 } );

while (myCursor.hasNext()) {
   print(tojson(myCursor.next()));
}

另一个可选的打印操作,考虑用printjson()帮助方法来替代prin(tojson())

var myCursor = db.users.find( { type: 2 } );

while (myCursor.hasNext()) {
   printjson(myCursor.next());
}

可以用游标方法forEach()来迭代游标,访问文档,如下:

var myCursor =  db.users.find( { type: 2 } );

myCursor.forEach(printjson);

查看Javascript 游标方法和你的驱动文档以获得关于游标的更多信息。

用下标迭代

mongoshell中,可以使用toArray()方法来迭代游标并以数组返回文档,如下:

var myCursor = db.inventory.find( { type: 2 } );
var documentArray = myCursor.toArray();
var myDocument = documentArray[3];

toArray()方法把所返回游标的所有文档载入内存中,直到耗尽游标。

此外,有些驱动提供了通过下标访问文档的功能(cursor[index])。这是先调用toArray()方法再对结果数组使用下标访问的一个快捷方法。

考虑以下代码:

var myCursor = db.users.find( { type: 2 } );
var myDocument = myCursor[1];

myCursor[1]等价于以下代码:

myCursor.toArray() [1];

游标行为

非活动游标的关闭

默认地,服务器会自动关闭超过10分钟没有活动的游标,或者被耗尽的游标。为在mongoshell中覆盖这一行为,可以使用cursor.noCursorTimeout()方法:

var myCursor = db.users.find().noCursorTimeout();

在设置了noCursorTimeout之后,必须用cursor.close()手动关闭游标或者耗尽游标结果。

查看驱动文档以获得关于设置noCursorTimeout选项的信息。

游标隔离

游标返回文档时,其它操作可能会插入到该查询中。对于MMAPv1存储引擎,在一个文档插入协操作可能导致一个游标多次返回该文档,如果该文档被修改乐的话。要处理这种情况,参见快照模式的相关信息。

游标批量

MongoDB服务器是批量返回查询结果的。每批的大小不应超出最大BSON文档大小。对于大部分查询,第一批返回101个文档或者足够数量文档,总大小超过了1M,后面批的大小就是4M。要覆盖每批的默认大小,见batchSizde()limit()

对于没有索引的排序查询,服务器必须把所有的文档载入内存,排序,然后返回结果。

当你通过游标来迭代,达到一批的末尾时,如果还有更多结果,cursor.next()将会执行一个获取更多的操作,以获取下一个批。迭代游标时要查看批里面还剩余多少文档,可以用objsLeftInBatch()方法,例子如下:

var myCursor = db.inventory.find();

var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null;

myCursor.objsLeftInBatch();

游标信息

db.serverStatus()方法返回一个含有metrics字段的文档。metrics包含一个metrics.cursor字段,该字段有如下信息:

  • 自服务器最近一次启动,超时的游标数量
  • 为了防止一段非活动时间后超时,用DBQuery.Option.noTimeout设置了的游标数量。
  • 被”固定“住的打开游标的数量
  • 总打开游标数

考虑以下例子,调用db.serverStatus()方法,访问结果中的metrics,然后访问metrics字段中的cursor字段:

db.serverStatus().metrics.cursor

结果是如下文档:

{
   "timedOut" : <number>
   "open" : {
      "noTimeout" : <number>,
      "pinned" : <number>,
      "total" : <number>
   }
}

参见:

db.serverStatus()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值