Cursors
游标是指向查询结果的指针。游标允许一次一批批处理迭代数据库结果。
用例
当您使用 mongosh
或驾驶员执行 find()
和 aggregate()
方法时,它们会返回一个包含批处理结果的游标。您可以通过手动迭代游标或使用 toArray()
方法访问权限结果文档。有关更多信息,请参阅在 mongosh
中迭代游标。
行为
在客户端会话中创建的游标将在以下情况下关闭:
客户端耗尽游标。
用户手动关闭游标。
空闲游标超过超时时间。
用户手动终止会话。
会话超时。
空闲游标超时由 cursorTimeoutMillis
参数指定,默认值为 10 分钟。每次游标返回新批处理时,游标超时时间都会延长。要手动关闭游标,请使用killCursors
。
服务器会话超时由 localLogicalSessionTimeoutMinutes
参数指定,默认值为 30 分钟。要将会话延长到超过 30 分钟,请使用 refreshSessions
。要手动终止会话,请使用killSessions
。
如果在会话外打开游标, MongoDB驱动程序和 mongosh
会创建一个隐式会话并将其与操作关联起来。
使用游标时的并发更新
当游标返回文档时,其他操作可能会在背景运行并影响结果,具体取决于读关注(read concern)级别。 有关详细信息,请参阅读取隔离性、一致性和新近度。
开始体验
详情
当您运行find
或 aggregate
操作时,数据库会执行查询,直到找到足够的文档来填充批处理。当批处理已满时,查询会暂停。服务器上暂停的查询称为游标,与暂停的查询关联的ID是游标ID。
数据库会将生成的批处理和游标ID返回给客户端。MongoDB驱动程序和 mongosh
将此数据存储在客户端游标实例中。如果在到达批处理末尾时有更多匹配文档,则客户端游标会使用 getMore
自动从服务器检索下一个批处理。要查看当前批处理中剩余多少结果,请使用 cursor.objsLeftInBatch()
。要检查当前批处理中或服务器上是否有剩余结果,请使用 cursor.hasNext()
。
游标批处理
游标分批返回结果。批处理中的数据量必须小于最大BSON文档大小 (16 MiB)。要指定批处理中允许的最大文档数,请参阅 cursor.batchSize()
。默认下,find()
和 aggregate()
操作的批处理大小为 101
。getMore
针对生成的游标发出的后续 操作没有默认批处理大小,因此它们仅受16 MB 消息大小的限制。
排序
对于包含不带索引的排序操作的查询,服务器必须在返回任何结果之前将所有文档加载到内存中以执行排序。
游标信息
db.serverStatus()
方法返回包含 metrics
字段的文档。metrics
字段包含一个 metrics.cursor
字段,其中包含详细的游标信息。要学习;了解详情,请参阅 metrics.cursor
。