在MongoDB MapReduce范围内传递Javascript类以供map使用

时间:2014-03-05 22:59:06

标签: javascript mongodb mapreduce

我在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的范围?

2 个答案:

答案 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);
};