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