为什么MongoDB map-reduce隐含了这个

时间:2018-11-02 13:23:33

标签: mongodb mapreduce mongodb-query

map-reduce用法如下

db.myCollection.mapReduce(function() {
  emit(this.smth);
},
function(key, values) {
  // return something done with key and values
});

我的问题是,为什么将地图部件实现为具有隐式this来引用正在处理的当前文档? IMO,将当前文档作为参数传递给map函数会更干净(我更喜欢不使用this编写所有JavaScript)。

实际上,这也排除了在mongo脚本中使用箭头功能的情况,因为此引用不适用于它们。

1 个答案:

答案 0 :(得分:2)

  

为什么将地图部件实现为具有隐式this来引用正在处理的当前文档?

MongoDB的Map / Reduce API创建于2009年,早于JavaScript中的箭头功能可用(通过ES6 / ES2015)。我只能推测设计意图,但是自从最初的Map / Reduce实现以来,JavaScript(和MongoDB)发生了很多变化。

JavaScript方法中的this关键字指所有者或执行上下文,因此,将其设置为正在处理的当前文档可能是当时使用JavaScript的合理约定(或方便性)。 reduce function具有必需的function (key, values)原型,因此map的{​​{1}}原型可能更加一致。但是,一旦选择了API,则任何重大的重大更改都将变得更具挑战性。

更现代的聚合方法看起来可能完全不同,这是MongoDB采取的一般方法。 MongoDB 2.2(2012年8月)中引入的Aggregation Framework是一种更高性能的数据聚合方法,并且在可能的情况下应优先于Map / Reduce。

MongoDB服务器的成功发行版对Aggregation Framework的功能和性能进行了重大改进,而Map / Reduce有了显着发展。例如,聚合框架是用C ++编写的,并且能够操纵MongoDB的本机BSON data types; Map / Reduce产生JavaScript线程,并且必须在BSON和JavaScript之间封送数据。

  

实际上,这也排除了在mongo脚本中使用箭头功能的情况,因为此引用不适用于它们。

的确。与MongoDB 4.0一样,Map / Reduce不支持箭头功能。有一个功能请求支持箭头功能,您可以在MongoDB问题跟踪器中{/ {3}}观看/更新。