使用 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 时,可将临时文件写入磁盘的阶段示例如下:
$sort当索引不支持排序操作时
注意
管道阶段对文档流进行操作,每个管道阶段接收文档,对其进行处理,然后输出结果文档。
某些阶段在处理完所有传入文档之前无法输出任何文档。这些管道阶段必须将其阶段输出保留在 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 限制了单个查询操作可以使用的内存总量。该限制适用于操作中所有内存跟踪阶段的组合内存。
追踪的内存包括:
表达式评估
缓冲记录的查询执行阶段,例如地理空间邻近搜索、使用索引的计数以及更新
默认情况下,限制为 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 将终止该操作并返回以下错误之一:
当可溢出到磁盘的阶段超过限制且
allowDiskUse为false时,QueryExceededMemoryLimitNoDiskUseAllowed。使用{ allowDiskUse: true }运行操作,以便阶段溢出到磁盘而不是失败。ExceededMemoryLimit针对超出限制的其他操作。
大多数操作使用的内存远低于该限制。如果操作返回内存限制错误,请通过执行以下一项或多项操作来减少该操作所需的内存:
使用索引来满足排序需求,这样 MongoDB 就无需在内存中对文档进行排序。要了解更多信息,请参阅排序和索引使用。
在 阶段之后添加
$limit$sort阶段,以便排序仅保留您需要的文档。要了解更多信息,请参阅 $sort 和 $limit 内存优化。
要检查每个操作的内存使用情况,请使用以下 serverStatus 指标: