MongoDB游标

在mongo命令行下,在集合中读取操作的主要方法是db.collection.find().这个方法从集合中查询,返回文档们的一个游标。

要查看这些文档,你需要迭代游标。然而,在mongo中,如果返回的游标没有使用var关键字分配给一个变量,游标自动的迭代20次,打印出结果中的20个文档。

例如,在mongo中,从inventory集合中查找类型匹配'food'的文档.找到后会自动打印出20个匹配的文档:

db.inventory.find( { type: 'food' } );

注:可以使用DBQuery.shellBatchSize来改变默认值为20的迭代次数。

一、游标行为

暂无封闭的游标

在默认情况下,闲置10分钟后,服务器将自动关闭游标,或者如果客户端已用尽光标.要覆盖此行为,您可以在查询中指定noTimeout线协议标志;但是,你应该手动关闭游标或用尽光标,在mongo命令行,你可以设置noTimeout 标志:

var myCursor = db.inventory.find().addOption(DBQuery.Option.noTimeout);

游标隔离

因为在游标的有效期是不隔离的,如果那些文档已经改变,可能导致一个文档因为写操作,而返回它的次数不止一次。要处理这种情况,请看快照模式。

游标批处理

MongoDB服务器批量返回查询结果。批量大小不会超过最大BSON文档的大小。对于最大的查询,第一批返回101个文档或者说文档的大小刚好达到1兆字节。随后每批的大小最大为4兆字节.要覆盖批次的默认大小,请用batchSize()和limit()。

对于包括一个排序操作的无索引查询,服务器必须加载所有的文档在内存中,然后执行排序,返回所有文档中的第一批。

当你遍历游标,至到批处理结束.如果有更多的结果,cursor.next()将执行一个能 getmore operation来检索下一个批次。在该批次为您遍历游标后看看之后还有多少文档剩余。您可以使

用objsLeftInBatch()方法。如下面的例子:

var myCursor = db.inventory.find();

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

myCursor.objsLeftInBatch();

二、游标信息

你可以使用命令cursorInfo检索有关游标的以下信息:

·打开的游标的总数
·客户端游标在目前使用的大小
·自上次重新启动服务器超时游标数量

请看下面的例子:
db.runCommand( { cursorInfo: 1 } )

该命令的结果返回下列文档:

{
  "totalOpen" : <number>,
  "clientCursors_size" : <number>,
  "timedOut" : <number>,
  "ok" : 1
}

京ICP备14008139号-1