使用 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 时,可将临时文件写入磁盘的阶段示例如下:
$sort当索引不支持排序操作时
注意
管道阶段对文档流进行操作,每个管道阶段接收文档,对其进行处理,然后输出结果文档。
某些阶段在处理完所有传入文档之前无法输出任何文档。这些管道阶段必须将其阶段输出保留在 RAM 中,直到处理完所有传入文档。因此,这些管道阶段所需的空间可能超过 100 MB 的限制。
如果某一 $sort 管道阶段的结果超过此限制,则可考虑添加一个 $limit 阶段。
每个操作的内存限制
从MongoDB 9.0 开始, MongoDB限制单个查询操作可以使用的内存总量。该限制适用于操作的所有内存跟踪阶段的总内存。
跟踪内存包括:
表达式求值
缓冲记录的查询执行阶段,例如地理空间邻近搜索、使用索引的计数和更新
默认下,该限制为 1 GB 或服务器进程可用内存的 20%,以较大者为准。 MongoDB在服务器启动时设置默认。
每个操作的限制与每个阶段 100 MB 的内存限制是分开的,并且不会改变阶段溢出到磁盘的方式。要学习;了解每个阶段的限制,请参阅内存限制。
如果操作超过每个操作的限制, MongoDB将结束该操作并返回以下错误之一:
QueryExceededMemoryLimitNoDiskUseAllowed(可能溢出到磁盘的阶段超过限制且allowDiskUse为false)。使用{ allowDiskUse: true }运行操作,以便阶段溢出到磁盘而不是失败。ExceededMemoryLimit对于其他超出限制的操作。
大多数操作使用的内存远小于限制。如果某个操作返回内存限制错误,请通过执行以下一项或多项操作来减少该操作所需的内存:
在
$sort阶段后添加$limit阶段,以便排序仅保留您需要的文档。要学习;了解详情,请参阅 $sort 和 $limit 内存优化。
要检查每个操作的内存使用情况,请使用这些 serverStatus指标: