几年前我看到过这个问题。从那时起,MongoDB 2.4 提供了多线程 Map Reduce(在切换到 V8 Javascript 引擎之后),并且比以前的版本更快,因此速度慢的论点不是问题。
但是,我正在寻找 Map Reduce 方法可能比聚合框架更有效的场景。事实上,可能是聚合框架根本无法工作但 Map Reduce 可以获得所需结果的场景。
谢谢,约翰
目前聚合框架结果不能超过 16MB。但是,我认为更重要的是,您会发现 AF 更适合本质上是动态的“此时此地”类型的查询(例如,用户在运行时提供过滤器)。
MapReduce 是预先计划好的,可能要复杂得多,并且会产生非常大的输出(因为它们只是output
针对新集合)。它没有您可以控制的运行时输入。您可以添加使用 AF 根本不可能(或高效)的复杂对象操作。在 MapReduce 中操作子数组(或类似数组的东西)很简单,因为您只是在编写 JavaScript,而在 AF 中,事情可能变得非常笨拙和难以管理。
最大的问题是 MapReduce 不会自动保持最新,而且很难预测它们何时会完成)。您需要实施自己的解决方案以使它们保持最新(与其他一些 NoSQL 选项不同)。通常,这只是某种时间戳和增量 MapReduce 更新,如此处所示)。您可能需要接受数据可能有些陈旧,并且它们需要未知的时间才能完成。
如果您在 StackOverflow 上四处寻找,您会发现许多非常有创意的解决方案来解决 MongoDB 的问题,并且许多解决方案使用聚合框架,因为它们正在解决 MongoDB 中通用查询引擎的限制,并且可以生成“实时/即时”结果。(一些 AF 管道非常复杂,但取决于开发人员/团队/产品,这可能是一个问题)。