為什麼 MongoDB 仍然支持 MapReduce,卻積極勸阻人們不要使用它?
查看 MongoDB 文件,我發現不鼓勵使用者使用 MapReduce 來支持聚合管道。
例如,在文件中的這個頁面上。
但就 Aggregation Framework 是否完全取代 MapReduce 而言,同樣的通知是模棱兩可的:
可以使用聚合管道運算符重寫各種 map-reduce 操作,例如 $ group, $ 合併等。對於需要自定義功能的 map-reduce 操作,MongoDB 提供 $ accumulator and $ 從 4.4 版開始的函式聚合運算符。
這是否意味著“所有可能的” MapReduce 配置都可以通過聚合框架複製?
我知道 MapReduce 執行上下文可能比聚合管道慢,因為前者需要一個 JavaScript 引擎,它是/曾經是/仍然是?比聚合管道實現慢。
deprecated
與其他功能不同,據我所知,MapReduce 尚未被標記。所以,我的問題是:聚合框架是否完全取代了 MapReduce(針對每個可能的案例)?或者是否存在 MapReduce 仍然提供更大靈活性的案例?
從 MongoDB 5.0 開始,Map-Reduce 終於被棄用了。JavaScript 函式求值比使用內置聚合運算符具有更多成本,並且通常強烈建議不要使用,除非沒有其他選擇。除了需要 JavaScript 引擎來評估自定義 JS 函式之外,MongoDB 的本機 BSON 文件格式和 JavaScript 對象之間的轉換還有成本。聚合運算符直接使用 BSON 文件,並且管道方法支持聚合管道優化,例如在可能的情況下自動重新排序或合併階段。
這是否意味著“所有可能的” MapReduce 配置都可以通過聚合框架進行複制
據我所知,是的。取消阻止棄用所需的兩個最重要的特性是對自定義 JavaScript 累加器和函式的支持,它們被添加到 MongoDB 4.4 的聚合框架中。早期版本中引入的聚合功能包括將結果合併到指定的集合和正則表達式模式匹配。聚合現在具有 Map-Reduce 之外的功能,包括視窗運算符、文件採樣和集合表達式運算符。
借用MongoDB 5.0 Map-Reduce 文件中的棄用標註:
- 您應該使用聚合管道而不是map-reduce。聚合管道提供比 map-reduce 更好的性能和可用性。
- 您可以使用聚合管道階段(例如 、 等)
$group
重寫map-reduce 操作$merge
。- 對於需要自定義功能的 map-reduce 操作,您可以使用
$accumulator
和$function
聚合運算符,從 4.4 版開始可用。您可以使用這些運算符在 JavaScript 中定義自定義聚合表達式。有關 map-reduce 的聚合管道替代方案的範例,請參閱: