Docs 菜单

getmore

getMore

与返回游标的命令结合使用。例如,findaggregate,用于返回游标当前指向的文档的后续批次。

此命令可用于以下环境中托管的部署:

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

该命令具有以下语法:

db.runCommand(
{
getMore: <long>,
collection: <string>,
batchSize: <int>,
maxTimeMS: <int>,
comment: <any>
}
)

该命令接受以下字段:

字段
类型
说明

getMore

long

游标标识符。

collection

字符串

游标所操作的集合的名称。

batchSize

正整数

Optional. The maximum number of documents that can be returned in each batch of a query result.

If batchSize is not set, getMore returns up to 16 mebibytes (MiB) of data in all subsequent batches. If batchSize is set, getMore returns the lesser of batchSize documents or 16 MiB worth of documents.

maxTimeMS

non-negative integer

可选。

指定服务器等待出现与固定大小集合可追加游标查询匹配的新文档的最长时间。对于可追加 awaitData 游标,getMore 上的 maxTimeMS 被认为与 maxAwaitTimeMS() 相同。驱动程序只会为固定大小集合上且 awaitData 设置为 true 的追加游标,在 getMore 上设置此值。否则,创建游标的命令会设置 maxTimeMS,这是初始操作和任何后续 getMore 操作可以累积执行查询所花费的最长时间。对于将 awaitData 设置为 true 的可追加游标,以下情况成立:

  • 如果未提供值,则等待时间默认为 1(1000 毫秒)。

  • getMore 上的 maxTimeMS 将指定 MongoDB 等待将新文档插入到特定 getMore 命令的固定大小集合中的最长时间。

  • 由驱动程序为每次调用 getMore 单独设置 maxTimeMS

MongoDB 使用与 db.killOp() 相同的机制终止超过分配的时间限制的操作。MongoDB 仅在指定的中断点之一中终止操作。

  • 在不可追加游标上调用 getMore 时,无法设置 maxTimeMS。相反,请在创建游标时使用 maxTimeMS() 进行设置。

  • 要在可追加游标上使用 getMoremaxTimeMS,请在使用 cursor.tailable() 创建游标时启用 awaitData

  • 在创建游标的命令上设置 maxTimeMS 仅设置该操作的时间限制。使用 getMore 为进一步的操作设限。

  • 您可以为每次调用 getMore 而设置或者可以省略 maxTimeMS,并且不必使用相同的值。

  • 对于可追加游标,getMore 的超时会保留游标中发生超时之前累积的文档。对于不可追加游标,超时会引发错误。

comment

any

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

如果省略,getMore 会继承在原始 findaggregate 命令上设置的任何 comment

此命令会返回包含游标信息的文档以及下一批处理。

例如,在分片集群上通过 find 操作创建的游标上运行 getMore 会返回与以下输出类似的文档:

{
"cursor" : {
"id" : NumberLong("678960441858272731"),
"ns" : "test.contacts",
"nextBatch" : [
{
"_id" : ObjectId("5e8e501e1a32d227f9085857"),
"zipcode" : "220000"
}
],
"partialResultsReturned" : true,
"postBatchResumeToken": "< Resume Token >"
},
"ok" : 1,
"operationTime" : Timestamp(1586385239, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1586385239, 2),
"signature" : {
"hash" : BinData(0,"lLjejeW6AQGReR9x1PD8xU+tP+A="),
"keyId" : NumberLong("6813467763969884181")
}
}
}
字段
说明

cursor

包含游标信息,包括游标 ID 以及文档的 nextBatch

如果find (或后续的getMore 命令)由于查询的分片不可用而返回部分结果,则 find 输出将包含partialResultsReturned 指示符字段。如果查询的分片可用于初始 find 命令,但一个或多个分片不可用于后续的 getMore 命令,则只有在分片不可用时运行的getMore 命令才会在其输出中包含 partialResultsReturned

postBatchResumeToken 字段可以与 $changeStream 管道一起使用,从此处开始或恢复变更流。

"ok"

表明命令是成功(1)还是失败(0)。

除这些字段外,db.runCommand() 响应还包括副本集和分片集群的以下信息:

  • $clusterTime

  • operationTime

请参阅 db.runCommand() 响应,了解详情。

如果启用了身份验证,那么您只能对您创建的游标运行 getMore

对于在会话内创建的游标,无法在会话外调用 getMore

同样,对于在会话外创建的游标,无法在会话内调用 getMore

对于多文档事务

  • 对于在事务之外创建的游标,无法在事务内调用 getMore

  • 对于在事务中创建的游标,无法在事务外调用 getMore

从 MongoDB 5.1 开始,当 getMore 命令记录为慢查询时,queryHashplanCacheKey 字段将添加到慢查询日志消息分析器日志消息中。

从MongoDB 8.0 开始,现有的 queryHash字段将复制到名为 planCacheShapeHash 的新字段中。 如果您使用的是早期MongoDB版本,则只能看到 queryHash字段。 未来的MongoDB版本将删除已弃用的 queryHash字段,您需要改用 planCacheShapeHash字段。