Если у вас возникли проблемы с картой / уменьшением, вам, вероятно, следует перейти в консоль mongodb, поработать с ней и затем преобразовать это в драйвер.
Взять, к примеру, следующие документы:
db.tasks.find()
{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "duration" : 10, "name" : "StartProcess", "date" : "20110501" }
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "duration" : 11, "name" : "StartProcess", "date" : "20110502" }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "duration" : 12, "name" : "StartProcess", "date" : "20110503" }
Вы бы написали mapReduce для расчета средней продолжительности StartProcess следующим образом:
m = function (){
emit( this.name , { totalDuration : this.duration , num : 1 } );
};
r = function (name, values){
var n = {totalDuration : 0, num : 0};
for ( var i=0; i<values.length; i++ ){
n.totalDuration += values[i].totalDuration;
n.num += values[i].num;
}
return n;
};
f = function(who, res){
res.avg = res.totalDuration / res.num;
return res;
};
Затем, если вы используете MongoDB 1.7 или выше:
db.tasks.mapReduce( m, r, { finalize : f, out : {inline : 1} });
даст вам следующий ответ:
"results" : [
{
"_id" : "StartProcess",
"value" : {
"totalDuration" : 33,
"num" : 3,
"avg" : 11
}
}
]
Если это не поможет, вы можете опубликовать функцию карты и структуру документа.