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

我该怎么做?

4

1 回答 1

1

当您在 MongoDB 中执行 mapReduce 时,您必须确保您的发出值与您的 reduce 返回值具有相同的格式。

这意味着在您的情况下,如果map调用emit(customer, points)thenreduce必须仅返回points.

要更改您的具体示例,您的 map 函数是可以的,但您的 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)

于 2012-11-20T00:05:54.010 回答