我在 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 调用时,它不会产生任何结果。甚至不是空白。
我在传递地图、减少函数时做错了什么吗?
有两个问题:
将函数作为参数传递给另一个函数 -
return mongoMan.mapReduceFunction("clients", mapFunction.toString(), reduceFunction.toString(), output, function(err, result){
if(err){
callback(err, null);
}else{
console.log(result);
callback(null, result);
}
另一个问题是变量的范围 - 参考这里 如何在MongoDB中使用变量 Map-reducemap函数
另外,我正在使用猫鼬。所以,这是mapReduce在猫鼬中的处理方式 - 猫鼬API