如何填充地图缩小的结果

时间:2012-11-04 14:30:32

标签: node.js mongodb mongoose

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")不起作用

我该怎么办?

1 个答案:

答案 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,指向具有字段名称_idvalue的键值对,其中value将是该_id(_customer)的所有点值的总和。

要查询您要运行的结果:

db.createdCollectionNameForResults.find().sort({value:-1}).limit(5)