8

我构建了一个 MongoDB。我想通过某些分组进行聚合。我找到了这个文件,它将为我做这件事。一切正常,但指出了某些限制:

  1. 管道的输出只能包含 16 兆字节。如果您的结果集超过此限制,则聚合命令会产生错误。

  2. 如果任何单个聚合操作消耗超过 10% 的系统 RAM,则该操作将产生错误。

  3. 聚合系统当前将$group操作存储在内存中,这在处理大量组时可能会导致问题。

我可以使用 MongoDB 聚合处理多少行/文档?我害怕使用这个。有人可以指导我吗?

4

2 回答 2

18

我从谷歌群组中得到了有效且有用的答案。想和大家分享。

限制不在于文档的数量:限制在于最终结果(或中间结果)使用的内存量。

所以:如果您聚合 200 000 个文档,但结果适合 16MB 的结果,那么您就可以了。如果您聚合 100 个文档并且结果不适合 16 MB,那么您将收到错误消息。

同样,如果您对中间结果执行 sort() 或 group(),并且该操作需要超过 10% 的可用 RAM,那么您将收到错误消息。这仅与您拥有多少文档松散相关:它是管道特定阶段有多大的函数。

我可以通过任何设置增加 16MB 吗?

16MB 限制仅适用于最终结果还是特定聚合(即中间结果 + 任何临时持有量 + 最终结果)?

16MB 限制不可调整。这是 MongoDB 中文档的最大大小。由于聚合框架当前是作为命令实现的,因此聚合的结果必须在单个文档中返回:因此有 16 MB 的限制。

看到这个帖子

于 2013-01-29T10:29:18.253 回答
1

聚合框架可能发生的处理量取决于您的架构。

聚合框架目前只能输出一个文档的相对文件(对于更大的输出,您将要观看: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%。

于 2013-01-10T10:47:26.767 回答