我有一个类似于以下内容的mongodb集合:
{
'_id' : '123123123123',
'FOO' : {
'A' : 2,
'B' : 1,
'C' : 5
},
'BAR' : {
'D' : 6,
'E' : 1
}
}
我将非常高兴,他向我解释了如何将数字求和成子文档。我想得到这个结果:
{
'_id' : 'blahblah',
'FOO' : 8,
'BAR' :13
}
答案 0 :(得分:1)
您可以在3.4中使用以下汇总。
更新:
db.colname.aggregate({
"$replaceRoot":{
"newRoot":{
"$mergeObjects":[
{"_id":"$_id"},
{"$arrayToObject":{
"$map":{
"input":{
"$filter":{
"input":{"$objectToArray":"$$ROOT"},
"cond":{"$in":["$$this.k",["FOO","BAR"]]}
}
},
"in":{
"k":"$$this.k",
"v":{
"$sum":{
"$let":{
"vars":{
"kv":{"$objectToArray":"$$this.v"}},
"in":"$$kv.v"
}
}
}
}
}
}}
]
}
}
})
原文:
db.colname.aggregate({
"$project":{
"FOO":{
"$sum":{
"$let":{
"vars":{"fookv":{"$objectToArray":"$FOO"}},
"in":"$$fookv.v"
}
}
},
"BAR":{
"$sum":{
"$let":{
"vars":{"barkv":{"$objectToArray":"$BAR"}},
"in":"$$barkv.v"
}
}
}
}
})
答案 1 :(得分:0)
我想您可以执行以下操作,只需传入数组以过滤字段即可:
var field = [ "FOO", "BAR" ];
db.test.aggregate([
{
$project:{
"values":{
$filter:{
input:{
"$objectToArray":"$$ROOT"
},
cond:{
$in:[
"$$this.k",
fields
]
}
}
}
}
},
{
$unwind:"$values"
},
{
$project:{
key:"$values.k",
values:{
"$sum":{
"$let":{
"vars":{
"item":{
"$objectToArray":"$values.v"
}
},
"in":"$$item.v"
}
}
}
}
}
]);
执行后将给出以下输出:
{ "_id" : "123123123123", "key" : "FOO", "values" : 8 }
{ "_id" : "123123123123", "key" : "BAR", "values" : 7 }