使用MongoDB中的箭头函数MapReduce函数

时间:2017-04-25 12:45:41

标签: javascript mongodb

我正在使用MongoDB中的箭头功能来编写MapReduce作业,我注意到了一些奇怪的行为。

我有一批学生如下:

{ "_id" : ObjectId("58ff3520704bd5539fe9dc7b"), "stud_id" : "x0000003", "name" : "david smith", "class" : "InfMgt", "weekNo" : 2, "attendencesThisWeek" : 4 }
{ "_id" : ObjectId("58ff3520704bd5539fe9dc7c"), "stud_id" : "x0000003", "name" : "david smith", "class" : "InfMgt", "weekNo" : 3, "attendencesThisWeek" : 2 }
{ "_id" : ObjectId("58ff3543704bd5539fe9dc7d"), "stud_id" : "x0000001", "name" : "sean smith", "class" : "edt", "weekNo" : 1, "attendencesThisWeek" : 2 }
{ "_id" : ObjectId("58ff3543704bd5539fe9dc7e"), "stud_id" : "x0000001", "name" : "sean smith", "class" : "edt", "weekNo" : 2, "attendencesThisWeek" : 2 }

...

现在我的任务是写一个MapReduce作业,找出每个学生到这个日期的总体注意力,所以我开始用箭头函数编写我的函数:

地图功能

const mapFunc = () => emit(this.stud_id, this.attendencesThisWeek)

这是发出任何内容,在线查询后,我发现箭头功能已经定义了this,这使得它不适合作为地图功能

  

在箭头函数内,这和参数引用的值   这个和环境中的参数定义了箭头函数   (即箭头功能“外部”)

所以我用“经典”方式重写了我的功能:

const mapFunc2 = function() {emit(this.stud_id, this.attendencesThisWeek)}

(我仍然使用const确保没有修改此功能或重新分配到mapFunc2

减少功能

完成后,我认为reduce函数应该没有问题,因为它没有使用this关键字。

我错了!

 const reduceFunc = (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek)

产生非常有趣的结果:

{ "_id" : "x0000002", "value" : (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek) }
{ "_id" : "x0000003", "value" : (key, countAttendencesThisWeek) => Array.sum(countAttendencesThisWeek) }

从进入相同的堆栈溢出回答我读到了这个:

  

ES2015区分可调用的函数和函数   这是可构造的。如果函数是可构造的,它可以是   用new调用,即new User()。如果一个函数是可调用的,它可以是   没有新的呼叫(即正常的函数调用)。

     

通过函数声明/表达式创建的函数都是   可构造和可调用的。箭头函数(和方法)只是   调用。类构造函数只能构造。

我的猜测是MongoDB调用reduce函数的方式使其作为箭头函数不可写,但在这里我需要帮助来理解实际发生的事情。

我将reduce函数再次更改为“classic”版本:

const reduceFunc2 = function(keyStudId, attendences) { return Array.sum(attendences) }

哪个好,但让我想知道为什么箭头功能不可用。

感谢您的阅读,对于那些学习过这种方式的强制性程序员来说,这可能是不重要的,但我想如果多年来一些大学开始教授功能性的第一和箭头功能,例如成为常态,这将是相当奇怪的对于那些必须适应的开发人员(如果不理解为什么事情会这样运作)。

请参阅https://stackoverflow.com/a/34361380/4884034

编辑:

  • db版本:3.2.7
  • 译员版:MozJS-38
  • Javascript引擎:mozjs

0 个答案:

没有答案