使用mongoose映射reduce:我的回调不是函数

时间:2016-04-07 23:47:13

标签: node.js mongodb mongoose mapreduce

我一直关注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的参数,并且在返回命令之前,mrErrormrResults都包含已由map / reduce操作。

老实说,我不明白。在抛出错误的时候,整个map / reduce操作已经完成,我试图执行回调函数的标准使用,以便将结果返回给调用者。如何将结果mrResults返回给调用上述过程的函数?

0 个答案:

没有答案