几年前我曾见过this。从那时起,MongoDB 2.4就可以使用多线程Map Reduce(在切换到V8 Javascript引擎之后)并且变得比以前的版本更快,所以慢速的论点不是问题。
但是,我正在寻找一种Map Reduce方法可能比Aggregation Framework更好的方案。事实上,可能是聚合框架根本无法工作但是Map Reduce可以获得所需结果的情况。
谢谢, 约翰
答案 0 :(得分:1)
看看this。
聚合FW结果存储在单个文档中,因此仅限于16 MB:这可能不适合某些情况。使用MapReduce,有几种可用的输出类型,包括一个新的整个集合,因此它没有空间限制。
通常,当您必须处理大型数据集(可能是整个集合)时,MapReduce会更好。此外,它提供了更大的灵活性(您编写自己的聚合逻辑),而不是局限于某些管道命令。
答案 1 :(得分:1)
目前聚合框架结果不能超过16MB。但是,我认为更重要的是,您会发现AF更适合于“此处和现在”类型的查询,这些查询本质上是动态的(例如,用户在运行时提供过滤器)。
MapReduce是预先计划好的,可能会更加复杂并产生非常大的输出(因为它们只是output
到新的集合。它没有您可以控制的运行时输入。您可以使用AF添加简单无法(或高效)的复杂对象操作。例如在MapReduce中操作子数组(或数组之类的东西)很简单,因为你只是编写JavaScript,而在AF中,事情会变得非常笨拙和无法管理。
最大的问题是MapReduce不会自动保持最新状态,并且很难预测它们何时完成。您需要实现自己的解决方案以使其保持最新(与其他一些NoSQL选项不同)。通常,这只是某种时间戳和增量MapReduce更新,如here所示。您可能需要接受数据可能有些陈旧,并且他们将花费未知的时间来完成。
如果你在StackOverflow上搜索,你会发现许多非常有创意的解决方案来解决MongoDB的问题,许多解决方案使用聚合框架,因为他们正在解决MongoDB中常规查询引擎的限制,并且可以生成“直播” /立即“结果。 (有些AF管道非常复杂,但根据开发人员/团队/产品的不同可能会引起关注。)