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脚本中使用箭头功能的情况,因为此引用不适用于它们。
答案 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}}观看/更新。