我一直关注documentation中的示例,实际上很容易在一个简单的示例上执行map / reduce操作。但是,我想要做的是创建一个map / reduce操作作为存储过程,然后使用mongoose按需调用它。出于这个原因,我写了一个看起来像这样的函数,我在一个小的db上测试它:
function myCustomMapReduce (myCallback) {
var o = {};
o.map = function () { emit(this.aProperty, this.id); };
o.reduce = function (key, values) { return values.length; };
o.finalize = function (key, reducedValues) { return reducedValues; };
o.out = {inline: 1};
o.verbose = true;
MyCollection.mapReduce(o, function (mrError, mrResults, stats) {
console.log (' **** Finished map reduce with error ' + mrError + ' in ' + stats.processtime + ' msecs');
console.log (JSON.stringify(mrResults, null, 3));
return myCallback(mrError, mrResults);
});
}
在运行时调用上面的函数,确实允许我看到一条表示成功完成的消息;也就是说,打印声明:
**** Finished map reduce with error null in 8 msecs
然后另一个console.log
语句也打印一个数组,其中包含我期望从整个map / reduce操作得到的结果。 (基本上,我的数据库中的每个对象都有一个标签,我正在计算标签的出现次数。)
相当令人惊讶的是,最后一句话
return myCallback(mrError, mrResults);
失败!特别是我得到了奇怪的错误:
TypeError: myCallback is not a function
你能帮我理解为什么会这样吗?我是否应该将另一个参数传递给具有我想要执行的map / reduce操作规范的对象o
?此错误非常奇怪,因为myCallback
是函数myCustomMapReduce
的参数,并且在返回命令之前,mrError
和mrResults
都包含已由map / reduce操作。
老实说,我不明白。在抛出错误的时候,整个map / reduce操作已经完成,我试图执行回调函数的标准使用,以便将结果返回给调用者。如何将结果mrResults
返回给调用上述过程的函数?