用于实时聚合的Mongodb设计&;存储

用于实时聚合的Mongodb设计&;存储,mongodb,Mongodb,假设我想在mongodb服务器上存储数百万篇博客和新闻文章 这些文章将有一些字段,我可以用于聚合,如:类别、作者、位置、域等。我可以将这些文章存储在mongo数据库中,但这些文章也有一些字段,如文本、摘要,其中包含大量数据,并可能使文档变得相当大(仍然

假设我想在mongodb服务器上存储数百万篇博客和新闻文章

这些文章将有一些字段,我可以用于聚合,如:类别、作者、位置、域等。我可以将这些文章存储在mongo数据库中,但这些文章也有一些字段,如文本、摘要,其中包含大量数据,并可能使文档变得相当大(仍然<16mb)

我的问题是,当mongodb运行聚合时,它是否会将整个文档读入内存并从内存进行聚合?显然,磁盘上的所有数据都无法装入内存。文档大小是否影响聚合性能

存储和“实时”聚合的最佳设计/替代方案是什么

我不想在我的项目中使用Hadoop之类的批处理,因为实时聚合是必须的。我见过2个mongo数据库的设置,1个用于存储原始文档,另一个仅用于存储星型模式中聚合的字段,但我并不喜欢这种方法,因为它需要在2个位置维护文档的2个版本

谢谢

我的问题是,当mongodb运行聚合时,它是否会将整个文档读入内存并从内存进行聚合

不,自最新版本以来,投影的工作方式发生了变化,现在它可以使用覆盖查询,或者说部分加载:

优化阶段将投影应用到管道的头部,以便在$match阶段的结果文档中也只返回_id和amount字段

因此,您可以加载文档的某些部分,而不用担心加载整个文本内容等

文档大小是否影响聚合性能

它影响任何操作。文档越大,加载它所需的IO就越多,即使分配在硬盘上是连续的

正如您所指出的,它也会影响内存使用。您的工作集可能会发现较大文档的问题,并且您可能会面临页面抖动

存储和“实时”聚合的最佳设计/替代方案是什么

使用增量map reduce进行预聚合是一个很好的选择:我个人使用它的次数远远超过聚合框架,并且取得了更大的成功

我不想在我的项目中使用Hadoop之类的批处理,因为实时聚合是必须的

“实时”?什么是“实时”?是用户在现场等待服务器处理数据大约30分钟,还是用户数据延迟2分钟,用户根本不等待页面加载时间等

如果需要高粒度,则可以在更新之间使等待时间接近5秒


实时并不总是在现场处理,只需看看这方面的许多其他网站。

这是一个需要以这种方式提问的小问题。试着把范围缩小到某个具体的问题,或者可能把这个问题分成你问题的一部分。谢谢@Sammaye的回答。当我说实时时,我的意思是数据应该能够在插入后立即读取/聚合。用户应该等待30秒,等待聚合结果返回。聚合过程不会发生在整个数据集上,但它将通过userId或其他方式与特定用户相关。例如,为客户a构建上个月前10个领域的新闻文章图表。这就是为什么我说Hadoop不是我的用例的理想选择。@VanThoaiNguyen是的,添加了这一点后,我将首先看看聚合是否太慢,如果是,我将转向预聚合,预聚合可能对我的案例没有帮助,因为我存储了与不同用户相关的重复文档。通过这种方式,用户可以按照自己的方式对新闻项目进行评分、更改和删除。聚合和过滤器会有很多组合,因此预聚合无法适应。@VanThoaiNguyen嗯,我必须知道您的场景的全部复杂性,才能对此提出建议,但我以前成功地将预聚合用于用户生成的内容,最常见的是视频统计。它可能对您身边的小而重的东西有用,甚至可能适合首先形成数据进行聚合framework@VanThoaiNguyen,您是否找到了适当的解决方案来避免预聚合?还是对数据的直接攻击效果良好?每个用户的最大文档数是多少?每个文档和整个文档有多少个属性?我也在寻找类似的直接,所以你们的答案将帮助许多ppl在论坛这里