我在Javascript中写了一个班级学生。
function Student(info) {
this.getName(info);
this.getAge(info);
}
Student.prototype.getName = function(info) {
this.name = info.name;
};
Student.prototype.getAge = function(info) {
this.age = info.age;
};
现在,我需要在mongoDB mapReduce框架的map函数中使用这个类。也就是说,
var mapFunction = function() {
var student = new Student(this);
emit(student.name, student.age);
};
此功能图无权访问此功能以外的学生。因此,我需要通过mapReduce的范围传递这个类。
var scopeVar = { Student: Student};
db.collection.mapReduce(
mapFunction,
{
scope: scopeVar,
out: { merge: 'testCollection'}
}
);
然而,事实证明,在内部地图中,我们有Student定义,但Student.prototype为空。为了测试这个,我写了另一个mapTest,
var mapTest = function() {
emit(Student, Student.prototype);
};
var scopeVar = { Student: Student};
db.collection.mapReduce(
mapTest,
{
scope: scopeVar,
out: { merge: 'testCollection'}
}
);
在db.testCollection中,可以看到输出文档看起来像这样
{_id: function Student(info) {
this.getName(info);
this.getAge(info);
},
value: {}
}
因此,似乎某种范围不会复制对象的原型。
如果想要将辅助函数定义为类的原型函数,如何将它传递给mapReduce的范围?
答案 0 :(得分:0)
我的假设是MongoDB是用C实现的,CLI或执行引擎读取代码并将其提交给V8Engine。因此,原型的解释上下文不会被CLI察觉,因此不会提交给V8引擎。范围参数增强了参数机制,但没有提供预期的完整动态性质。在内部,mongodb必须创建具有给定范围的另一个函数。要实现你提到的,我会尝试这样的事情:
这应该有用。
var scopeVar = { Student: Student, StudentPrototype: Student.prototype };
var mapFunction = function() {
Student.prototype = StudentPrototype;
var student = new Student(this);
emit(student.name, student.age);
};
答案 1 :(得分:0)
上述答案在方法中是正确的。正确的答案如下。
var scopeVar = { Student: Student, StudentPrototype: Student.prototype };
var mapFunction = function() {
Student.prototype = StudentPrototype;
var student = new Student(this);
emit(student.name, student.age);
};