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
}