我有这个集合
{a:0,b:1,c:1,d:1}
{a:1,b:1,c:0,d:1}
{a:1,b:1,c:0,d:1}
我希望这个结果与mapReduce
{id: any, A:2,B:3,C:1,D:3}
但我不知道怎么做,我只能总结一下 我是怎么做到的?
答案 0 :(得分:1)
emit
函数可以map
所有记录的公共密钥:
var map = function(){emit(1,this);}
reduce
函数将计算总和并返回值。
var reduce = function(key,values){
var result = {};
values.forEach(function(i){
Object.keys(i).forEach(function(key){
if(result.hasOwnProperty(key)){
result[key] = i[key]+result[key];
}
else{
result[key] = i[key];
}
})
})
return result;
}
执行map reduce:
db.collection.mapReduce(map,reduce,{ out: "out"})
如果你事先知道了密钥,那么只需使用管道中的$group
阶段就可以轻松地汇总结果。
db.collection.aggregate([
{$group:{"_id":null,
"a":{$sum:"$a"},
"b":{$sum:"$b"},
"c":{$sum:"$c"},
"d":{$sum:"$d"}}}
])