我有以下记录:
{ "_id" : 1, "c" : 120, "b" : [ { "f1" : 10 }, { "f1" : 10 } ] }
{ "_id" :2, "c" : 5, "b" : [ { "f1" : 10 }, { "f1" : 10 } ] }
我需要这样输出:
{ "_id" : 1, 'total':140}
{ "_id" :2, 'total':25 }
其中total =' c'与f1中相同记录的值之和。
当我放松场地时,' b'它创建两个具有相同id的文档,因此数据被复制,当我总结时,我得到:
db.test2.aggregate([
{'$unwind':'$b'},
{'$project':{'total':{'$add':['$c','$b.f1']}}},
{'$group':{'_id':'$_id', 'total':{'$sum':'$total'}}}
])
输出:
{ "_id" : 1, 'total':260}
{ "_id" :2, 'total':30 }
(不是我想要的,因为在展开过程中由于重复而增加了120和5)
所以我试过了:
db.test2.aggregate([
{'$unwind':'$b'},
{'$group':{'_id':'$_id', 'c':{'$push': '$c'},'f1':{'$sum':'$b.f1'}}},
{'$project':{'total':{'$add':[{'$arrayElemAt':['$c',0]},'$f1']}}}
])
输出:
{ "_id" : 1, 'total':140}
{ "_id" :2, 'total':25 }
(我想要的)
还有其他方法可以达到这个目的吗?
答案 0 :(得分:2)
您可以尝试以下查询。求和运算符首先计算数组中的和,然后加上与其他字段计算总和。
db.test2.aggregate([{
$project: {
total: {"$add":["$c", {"$sum":"$b.f1"}]}
}
}]
答案 1 :(得分:1)
替代方案:
db.test2.aggregate([{
$project: {
_id: 0,
c: "$c",
b: {
$reduce: {
input: "$b.f1",
initialValue: 0,
in: {
$add: ["$$value", "$$this"]
}
}
}
}
},
{
$project: {
_id: 0,
total: {
$sum: ["$c", "$b"]
}
}
}
])
这会产生结果:
{
"total" : 140
}
{
"total" : 25
}
如果您需要字段_id
,请将_id: 0
中的$project
替换为_id: 1
这会产生这样的结果:
{
"_id" : 1,
"total" : 140
}
{
"_id" : 2,
"total" : 25
}