对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
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 启用向磁盘写入临时文件的功能。

$search 聚合阶段不限于 100 MB 的 RAM,因为它在单独的进程中运行。

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

注意

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

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

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

除了每个阶段的限制之外,单个操作使用的内存不能超过每个操作的内存限制。

如果任何聚合阶段因内存限制而将数据写入临时文件,则分析器日志消息和诊断日志消息会包含 usedDisk 指示器。

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

跟踪内存包括:

  • 阻塞阶段,例如 $group 和 $sort

  • 表达式求值

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

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

每个操作的限制与每个阶段 100 MB 的内存限制是分开的,并且不会改变阶段溢出到磁盘的方式。要学习;了解每个阶段的限制,请参阅内存限制。

如果操作超过每个操作的限制, MongoDB将结束该操作并返回以下错误之一:

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

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