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 の戻り値と同じ形式であることを確認する必要があります。

つまり、あなたの場合、 ifmap呼び出しはemit(customer, points)reduce単に の値を返さなければならないことを意味しますpoints

特定の例を変更するには、 map 関数は問題ありませんが、reduce 関数は次のようにする必要があります。

reduce = function(_customer, values) {
        var result =  0;
        values.forEach(function(point){
            result += point;
        });
        return result;
    };

次に、reduce 関数は、各 _customer のすべての値 (ポイント) を合計します。これが目的です。出力は _customer で、フィールド名_idを持つキーと値のペアとしてのポイントvalueであり、値はその _id (_customer) のすべてのポイント値の合計です。

結果をクエリするには、次を実行します。

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

于 2012-11-20T00:05:54.010 に答える