查看 MongoDB 文档,我发现不鼓励用户使用 MapReduce 来支持聚合管道。
例如,在文档中的这个页面上。
但就 Aggregation Framework 是否完全取代 MapReduce 而言,同样的通知是模棱两可的:
可以使用聚合管道运算符重写各种 map-reduce 操作,例如 $group、$merge 等。对于需要自定义功能的 map-reduce 操作,MongoDB 从版本 4.4 开始提供 $accumulator 和 $function 聚合运算符。
这是否意味着“所有可能的” MapReduce 配置都可以通过聚合框架复制?
我知道 MapReduce 执行上下文可能比聚合管道慢,因为前者需要一个 JavaScript 引擎,它是/曾经是/仍然是?比聚合管道实现慢。
deprecated
与其他功能不同,据我所知,MapReduce 尚未被标记。所以,我的问题是:
聚合框架是否完全取代了 MapReduce(针对每个可能的用例)?或者是否存在 MapReduce 仍然提供更大灵活性的用例?
答案是否定的,聚合框架不会取代“所有可能的” MapReduce 配置。如果不成为具有完全可定制功能的通用 MapReduce 框架,它就不能。这就是您使用现有 MapReduce 功能所获得的 - 您想要的任何功能(当然,只要它们可以用 Javascript 编写)。
我已经很长时间(几年)没有使用它了,但不仅仅是因为使用了 javascript 引擎,MapReduce 功能较慢,它仍然会在写入输出时执行全局写入锁(docs )之类的事情这将阻止所有其他操作
mongod
- 哎哟。甚至在此之前的几个版本,当聚合框架远没有现在的功能时,建议是:如果你可以使用聚合框架,那就这样做,只有在别无选择的情况下才使用 MapReduce。从 MongoDB 5.0 开始,Map-Reduce 终于被弃用了。JavaScript 函数求值比使用内置聚合运算符具有更多开销,并且通常强烈建议不要使用,除非没有其他选择。除了需要 JavaScript 引擎来评估自定义 JS 函数之外,MongoDB 的本机 BSON 文档格式和 JavaScript 对象之间的转换还有开销。聚合运算符直接使用 BSON 文档,并且管道方法支持聚合管道优化,例如在可能的情况下自动重新排序或合并阶段。
据我所知,是的。取消阻止弃用所需的两个最重要的特性是对自定义 JavaScript 累加器和函数的支持,它们被添加到 MongoDB 4.4 的聚合框架中。早期版本中引入的聚合功能包括将结果合并到指定的集合和正则表达式模式匹配。聚合现在具有 Map-Reduce 之外的功能,包括窗口运算符、文档采样和集合表达式运算符。
借用MongoDB 5.0 Map-Reduce 文档中的弃用标注: