TestSessionSchema.statics.getTopTesters = function(callback){
var o = {};
o.map = function(){
emit(this._customer, this.points);
};
o.reduce = function(_customer, values){
var result = {_customer: _customer, sum_points: 0, };
values.forEach(function(point){
result.sum_points += point;
});
return result;
};
o.out = { replace: 'createdCollectionNameForResults' };
o.verbose = true;
this.mapReduce(o,function(err, model, stats){
model.find().sort({'value.sum_points': "desc"}).limit(5).populate("_customer").exec(function(error, results){
log(results);
})
});
}
在map-reduce部分,我正在考虑_customers的观点。
现在我想填充_customer以获取客户的信息
model.find().sort({'value.sum_points': "desc"}).limit(5).populate("_customer")
不起作用
我该怎么办?
答案 0 :(得分:1)
在MongoDB中执行mapReduce时,必须确保您的emit值与reduce返回值的格式相同。
这意味着,如果map
调用emit(customer, points)
,则reduce
必须只返回points
的值。
要更改您的具体示例,您的地图功能可以,但您的reduce功能应为:
reduce = function(_customer, values) {
var result = 0;
values.forEach(function(point){
result += point;
});
return result;
};
然后,您的reduce函数会将每个_customer的所有值(点)相加,这就是您想要的。输出将是_customer,指向具有字段名称_id
和value
的键值对,其中value将是该_id(_customer)的所有点值的总和。
要查询您要运行的结果:
db.createdCollectionNameForResults.find().sort({value:-1}).limit(5)