Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在MongoDB MapReduce函数中使用箭头函数_Javascript_Mongodb - Fatal编程技术网

Javascript 在MongoDB MapReduce函数中使用箭头函数

Javascript 在MongoDB MapReduce函数中使用箭头函数,javascript,mongodb,Javascript,Mongodb,我正在玩MongoDB中的箭头函数来编写MapReduce作业,我注意到一些奇怪的行为 我收集了以下学生: { "_id" : ObjectId("58ff3520704bd5539fe9dc7b"), "stud_id" : "x0000003", "name" : "david smith", "class" : "InfMgt", "weekNo" : 2, "attendencesThisWeek" : 4 } { "_id" : ObjectId("58ff3520704bd5539f

我正在玩
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)
这是没有发出任何东西,在联机查找后,我发现箭头函数已经定义了
这个
,这使得它不适合作为这里的映射函数

在arrow函数中,此参数和参数引用 此参数和arrow函数在中定义的环境中的参数 (即箭头功能的“外部”)

因此,我以“经典”的方式重写了我的函数:

(我仍然使用
const
来确保没有任何内容正在修改函数或重新分配到
mapFunc2

减少功能

const mapFunc = () => emit(this.stud_id, this.attendencesThisWeek)
完成后,我认为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函数更改为“经典”版本:

const reduceFunc2 = function(keyStudId, attendences) { return Array.sum(attendences) }
这很好,但让我想知道为什么这里的箭头函数不可用

感谢您的阅读,这可能对以这种方式学习的命令式程序员来说并不重要,但我想,如果几年后一些大学开始先教授函数,例如箭头函数成为规范,那么对于那些开发人员来说,必须进行适应将是非常奇怪的(如果不理解为什么事情会这样)

编辑:

  • db的版本:
    3.2.7
  • 解释器版本:
    MozJS-38
  • Javascript引擎:
    mozjs

我添加了这些版本作为编辑@JohnnyHK@Thomas发行说明没有说明您应该在何处以及为什么使用新功能,或者某些功能不合适。它只是说已经实现了。类似的问题(?)我还面临..在我的例子中,函数是在不同的上下文中被对象调用的。这些函数中的value.this关键字不在对象上下文中