Tôi nghĩ rằng bạn sẽ cần giảm bản đồ cho điều này, để viết một hàm có thể truy cập các vị trí cụ thể trong mảng. Bạn có thể thử một cái gì đó như thế này:
Chức năng ánh xạ:
var M = function() {
emit( this.agent, { score : this.score, qv : this.qv } )
}
Giảm chức năng:
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;
}
Sau đó, bạn có thể chạy hàm mapReduce sau trên bộ sưu tập của mình:
db.foo.mapReduce( M, R, { out : "resultCollection" } )
Và điều đó sẽ mang lại cho bạn kết quả mong muốn sau đây!
{
"_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]
}
}