我构建了一个 MongoDB。我想通过某些分组进行聚合。我找到了这个文件,它将为我做这件事。一切正常,但指出了某些限制:
管道的输出只能包含 16 兆字节。如果您的结果集超过此限制,则聚合命令会产生错误。
如果任何单个聚合操作消耗超过 10% 的系统 RAM,则该操作将产生错误。
聚合系统当前将
$group
操作存储在内存中,这在处理大量组时可能会导致问题。
我可以使用 MongoDB 聚合处理多少行/文档?我害怕使用这个。有人可以指导我吗?
我从谷歌群组中得到了有效且有用的答案。想和大家分享。
限制不在于文档的数量:限制在于最终结果(或中间结果)使用的内存量。
所以:如果您聚合 200 000 个文档,但结果适合 16MB 的结果,那么您就可以了。如果您聚合 100 个文档并且结果不适合 16 MB,那么您将收到错误消息。
同样,如果您对中间结果执行 sort() 或 group(),并且该操作需要超过 10% 的可用 RAM,那么您将收到错误消息。这仅与您拥有多少文档松散相关:它是管道特定阶段有多大的函数。
我可以通过任何设置增加 16MB 吗?
16MB 限制仅适用于最终结果还是特定聚合(即中间结果 + 任何临时持有量 + 最终结果)?
16MB 限制不可调整。这是 MongoDB 中文档的最大大小。由于聚合框架当前是作为命令实现的,因此聚合的结果必须在单个文档中返回:因此有 16 MB 的限制。
看到这个帖子
聚合框架可能发生的处理量取决于您的架构。
聚合框架目前只能输出一个文档的相对文件(对于更大的输出,您将要观看:https ://jira.mongodb.org/browse/SERVER-3253 ),它将以以下形式输出:
{
result: { //the result },
ok: 1/0
}
所以你必须确保你从$group
/$project
中得到的东西不会太大,以至于你不能得到你需要的结果。大多数情况下情况并非如此,$group
即使是数百万行的简单操作也可能导致小于 16Meg 的响应。
我们不知道您的文档大小或您希望运行的聚合查询,因此我们无法提供建议。
如果任何单个聚合操作消耗超过 10% 的系统 RAM,则该操作将产生错误。
这真的很不言自明。如果一个操作的工作集太大以至于占用超过 10% 的 RAM($group
/Computed fields/$sort
在计算或分组的字段上),那么它将无法工作。
除非您尝试滥用聚合框架来为您执行应用程序逻辑,否则您永远不应该真正遇到这个问题。
聚合系统当前将 $group 操作存储在内存中,这在处理大量组时可能会导致问题。
由于$group
真的很难不在内存中进行(它“分组”该字段),这意味着对该组的操作也在内存中,即$sort
如果您不小心,您可以开始使用这 10%。