Map Reduce不为NodeJS MongoDB本机驱动程序提供结果

时间:2016-07-06 06:48:46

标签: node.js mongodb mapreduce

我在NodeJS中的map-reduce函数是这样的:

 exports.getDistinctURLCount = function(params, callback){
    var mapFunction = function(){
        var bucket = 10;
        emit(Math.floor(parseInt(this.xyz)/bucket), {count: 1});
    };

    var reduceFunction = function(key, values){
     var urlCount = 0;
     if(values != undefined){
       values.forEach( function(value) {
         urlCount += value.count ;
       });
     }
     return urlCount;
    };

    var finalizeFunction = function (key, reducedVal) {
       if(isNaN(reducedVal)){
        return reducedVal.count
       }else{
        return reducedVal
       }
      };

    var output = {
       out: {"inline":1},
       finalize: finalizeFunction
      };

      return mongoMan.mapReduceFunction("clients", mapFunction, reduceFunction, output, function(err, result){
        if(err){
          callback(err, null);
        }else{
          console.log(result);
          callback(null, result);
        }
 }

MongoMan是一个不同的文件,它接受map-reduce函数:

exports.mapReduceFunction = function(collection, map, reduce, options, callback){
  _getModel(collection).mapReduce(map, reduce, options, function(err, docs){
    _prepResponse(err, docs, callback);
  });
}

map reduce查询在Mongo Shell中成功运行,但是当通过NodeJS调用时,它不会产生任何结果。甚至不是空白。

我在传递地图时做错了什么,减少了功能?

1 个答案:

答案 0 :(得分:0)

有两个问题:

将函数作为参数传递给另一个函数 -

return mongoMan.mapReduceFunction("clients", mapFunction.toString(), reduceFunction.toString(), output, function(err, result){
    if(err){
      callback(err, null);
    }else{
      console.log(result);
      callback(null, result);
    }

另一个问题是变量的范围 - 请参阅此处How to use variables in MongoDB Map-reduce map function

另外,我使用的是Mongoose。所以,这里是mapOeduce在Mongoose中处理的方式 - Mongoose API