对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

聚合管道限制

使用 aggregate 命令的聚合操作具有以下限制。

aggregate命令既可以返回游标,也可以将结果存储在集合中。结果设立的每个文档均受 MB16 BSON文档大小限制的约束。如果任何单个文档超过BSON文档大小限制,则聚合会产生错误。该限制仅适用于返回的文档。 在管道处理过程中,文档可能会超过此大小。 默认下,db.collection.aggregate() 方法会返回一个游标。

MongoDB 将单个管道中允许的聚合管道阶段数量限制为 1000 个。

如果聚合管道在解析之前或之后超过阶段限制,您会收到错误消息。

从 MongoDB 6.0 开始,allowDiskUseByDefault 参数可控制需要 100 MB 以上内存容量来执行的管道阶段是否默认会将临时文件写入磁盘。

  • 如果将 allowDiskUseByDefault 设为 true,则默认情况下,需要 100 MB 以上内存容量的管道阶段会将临时文件写入磁盘。您可以使用 { allowDiskUse: false } 选项来为特定的 find 或 aggregate 命令禁用将临时文件写入磁盘的功能。

  • 如果 allowDiskUseByDefault 设置为 false,则默认情况下,需要超过 100 MB 的内存才能执行的管道阶段会引发错误。您可以使用 { allowDiskUse: true } 选项来为特定 find 或 aggregate 启用向磁盘写入临时文件的功能。

The $search aggregation stage is not restricted to 100 megabytes of RAM because it runs in a separate process.

当 allowDiskUse 为 true 时,可将临时文件写入磁盘的阶段示例如下:

注意

管道阶段对文档流进行操作,每个管道阶段接收文档,对其进行处理,然后输出结果文档。

某些阶段在处理完所有传入文档之前无法输出任何文档。这些管道阶段必须将其阶段输出保留在 RAM 中,直到处理完所有传入文档。因此,这些管道阶段所需的空间可能超过 100 MB 的限制。

如果某一 $sort 管道阶段的结果超过此限制,则可考虑添加一个 $limit 阶段。

In addition to the per-stage limit, a single operation can use no more memory than the per-operation memory limit.

The profiler log messages and diagnostic log messages includes a usedDisk indicator if any aggregation stage wrote data to temporary files due to memory restrictions.

从 MongoDB 9.0 开始,MongoDB 限制了单个查询操作可以使用的内存总量。该限制适用于操作中所有内存跟踪阶段的组合内存。

追踪的内存包括:

  • 诸如 $group 和 $sort 等阻塞阶段

  • 表达式评估

  • 缓冲记录的查询执行阶段,例如地理空间邻近搜索、使用索引的计数以及更新

默认情况下,限制为 1 GB 或服务器进程可用内存的 20%,以较大者为准。MongoDB 在服务器启动时设置默认值。

要更改单次操作的限制,请在初创企业、运行时或使用查询设置来设置 internalQueryMaxMemoryUsageBytesPerOperation 参数。

对于单次操作限制未涵盖的内存密集型表达式,MongoDB 会对表达式子集可以使用的最大内存应用限制。此限制的默认值为 100 兆字节。要更改此限制,请在 初创企业 或运行时设置 internalQueryMaxSingleExpressionMemoryUsageBytes 参数。

The per-operation limit is separate from the 100 megabyte per-stage memory limit and doesn't change how stages spill to disk. To learn about the per-stage limit, see Memory Restrictions.

如果操作超过了单次操作的限制,MongoDB 将终止该操作并返回以下错误之一:

大多数操作使用的内存远低于该限制。如果操作返回内存限制错误,请通过执行以下一项或多项操作来减少该操作所需的内存:

  • 使用索引来满足排序需求,这样 MongoDB 就无需在内存中对文档进行排序。要了解更多信息,请参阅排序和索引使用。

  • 在 阶段之后添加$limit $sort阶段,以便排序仅保留您需要的文档。要了解更多信息,请参阅 $sort 和 $limit 内存优化。

  • 在管道中尽早使用 $match 过滤器处理文档,以便后续阶段处理更少的文档。如需了解更多信息,请参阅聚合管道优化。

要检查每个操作的内存使用情况,请使用以下 serverStatus 指标: