参考 > MongoDB CRUD操作 > 查询文件 > 在mongoShell中迭代游标
该db.collection.find()
方法返回一个游标。要访问文档,您需要迭代游标。但是,在
mongo
外壳程序中,如果未使用var
关键字将返回的光标分配给变量,则光标将自动迭代多达20次[1],以打印结果中的前20个文档。
以下示例描述了手动迭代游标以访问文档或使用迭代器索引的方法。
在mongo
外壳程序中,当您find()
使用var
关键字将方法返回的游标分配给变量时,游标不会自动进行迭代。
您可以在外壳程序中调用cursor变量以进行多达20次迭代 [1]并打印匹配的文档,如以下示例所示:
您还可以使用cursor方法next()
访问文档,如以下示例所示:
作为替代的打印操作,请考虑使用printjson()
helper方法来替换print(tojson())
:
您可以使用cursor方法forEach()
来迭代光标并访问文档,如以下示例所示:
有关游标方法的更多信息,请参见JavaScript游标方法和 驱动程序文档。
[1] | (1,2)可以使用DBQuery.shellBatchSize 从默认值改变迭代次数20 。有关更多信息,请参阅
使用mongo Shell。 |
在mongo
外壳程序中,可以使用
toArray()
方法来迭代游标并以数组形式返回文档,如下所示:
该toArray()
方法将游标返回的所有文档加载到RAM中。该toArray()
方法耗尽光标。
此外,某些驱动程序通过使用光标(即cursor[index]
)上的索引来提供对文档的访问
。这是首先调用该toArray()
方法然后在结果数组上使用索引的快捷方式
。
考虑以下示例:
在myCursor[1]
等效于下面的例子:
默认情况下,服务器将在闲置10分钟或客户端用尽光标后自动关闭光标。要在mongo
外壳程序中覆盖此行为,可以使用以下cursor.noCursorTimeout()
方法:
设置该noCursorTimeout
选项后,必须使用cursor.close()
或通过用尽光标的结果来关闭光标。
有关设置选项的信息,请参见驱动程序文档noCursorTimeout
。
当游标返回文档时,其他操作可能会与查询交错。
MongoDB服务器批量返回查询结果。批处理中的数据量将不超过BSON文档的最大大小。要覆盖批次的默认大小,请参见batchSize()
和
limit()
。
在新版本3.4:类型的操作find()
,
aggregate()
,
listIndexes
,和
listCollections
最大的每批16兆字节返回。batchSize()
可以强制执行一个较小的限制,但不能执行较大的限制。
find()
并且aggregate()
操作的初始批处理大小默认为101个文档。getMore
针对结果游标发出的后续操作没有默认的批处理大小,因此它们仅受16 MB消息大小的限制。
对于包含不带索引的排序操作的查询,服务器必须在返回任何结果之前将所有文档加载到内存中以执行排序。
当您遍历游标并到达返回批次的末尾时,如果还有更多结果,cursor.next()
将执行来检索下一个批次。若要查看在迭代游标时批处理中剩余多少文档,可以使用方法,如以下示例所示:getMore operation
objsLeftInBatch()
该db.serverStatus()
方法返回包含metrics
字段的文档。该
metrics
字段包含metrics.cursor
具有以下信息的
字段:
DBQuery.Option.noTimeout
设置了选项以防止一段时间不活动后超时的打开游标的数量
考虑以下示例,该示例调用
db.serverStatus()
方法并metrics
从结果中访问字段,然后从cursor
字段中访问metrics
字段:
结果是以下文档:
也可以看看