3

Aggregation Framework と Mapreduce に関する Mongodb のドキュメントを読んでいますが、配列内の整数の「列」の集約をどこから始めればよいかまだわかりません。これらのドキュメントを持つ Fi:

[{ "_id" : "A", "agent" : "006", "score" : [ 1, 0, 0 ], "qv" : [ 1, 0, 1, 0, 1 ] },
 { "_id" : "B", "agent" : "006", "score" : [ 0, 1, 0 ], "qv" : [ 1, 0, 1, 0, 1 ] },
 { "_id" : "C", "agent" : "006", "score" : [ 1, 0, 0 ], "qv" : [ 1, 0, 1, 0, 0 ] },
 { "_id" : "D", "agent" : "007", "score" : [ 1, 0, 0 ], "qv" : [ 1, 0, 1, 0, 0 ] }] 

期待される結果は次のようになります。

[
  {"agent": "006", "score": [2, 1, 0], "qv": [3, 0, 3, 0, 2]},
  {"agent": "007", "score": [1, 0, 0], "qv": [1, 0, 1, 0, 0]}
]

Aggregation Framework はこのタスクに十分ですか、それとも Mapreduce を目指すべきですか?

4

1 に答える 1

3

配列内の特定の位置にアクセスできる関数を作成するには、これには map reduce が必要になると思います。次のようなことを試すことができます:

マッピング機能:

var M = function() { 
    emit( this.agent, { score : this.score, qv : this.qv } )
}

縮小機能:

var R = function(key, values) {
    var result = { score : [0, 0, 0], qv : [0, 0, 0, 0, 0] };
    values.forEach( function(value) {
        for ( var i = 0; i < value.score.length; i ++ ) {
            result.score[i] += parseInt(value.score[i]);
        }
        for ( var i = 0; i < value.qv.length; i ++ ) {
            result.qv[i] += parseInt(value.qv[i]);
        }
    });
    return result;     
}

その後、コレクションに対して次の mapReduce 関数を実行できます。

db.foo.mapReduce( M, R, { out : "resultCollection" } )

そして、それはあなたに次の望ましい結果を与えるはずです!

{
"_id" : "006",
"value" : {
    "score" : [2, 1, 0],
    "qv" : [ 3, 0, 3, 0, 2 ]
}
}
{
"_id" : "007",
"value" : {
    "score" : [ 1, 0, 0],
    "qv" : [ 1, 0, 1, 0, 0]
}

}

于 2012-12-11T23:04:46.810 に答える