我在集合中有这些数据:
{id:1, types:{'A':4, 'B': 3, 'C':12}}
{id:1, types:{'A':8, 'B': 2, 'C':11}}
{id:2, types:{'A':7, 'B': 6, 'C':14}}
{id:3, types:{'A':1, 'B': 9, 'C':15}}
我想查询 id:1 的每个类型的总计,但我还想知道每个类型的总计单个查询中的所有 id 。我希望输出看起来像这样:
{id:1, types:{'A':12, 'B':5, 'C':12, 'sumA':20,'sumB':20,'sumC':52}}
我可以通过调用2个单独的查询来完成此操作。一个包含
的查询 {$match: {id:1}}
还有一个没有$ match选项的人。但我想知道它是否可以在一个查询中完成。
编辑:类型A,B和C是动态的,所以我不会事先知道这些值。
谢谢!
答案 0 :(得分:1)
您可以使用以下聚合查询。
与$group
进行 $sum
聚合以计算总计数,并使用$cond
来限制特定ID的计数。
db.col.aggregate([
{"$group":{
"_id":null,
"sumA":{"$sum":"$types.A"},
"sumB":{"$sum":"$types.B"},
"sumC":{"$sum":"$types.C"},
"A":{"$sum":{"$cond":[{"$eq":["$id",1]},"$types.A",0]}},
"B":{"$sum":{"$cond":[{"$eq":["$id",1]},"$types.B",0]}},
"C":{"$sum":{"$cond":[{"$eq":["$id",1]},"$types.C",0]}},
}}
])
更新到以下结构
{id:1, types:[{"k":'A', v:4}, { "k":'B', "v": 3}, { "k":'C', "v": 12}]}
{id:1, types:[{"k":'A', v:8}, { "k":'B', "v": 2}, { "k":'C', "v": 11}]}
{id:2, types:[{"k":'A', v:7}, { "k":'B', "v": 6}, { "k":'C', "v": 14}]}
{id:3, types:[{"k":'A', v:1}, { "k":'B', "v": 9}, { "k":'C', "v": 15}]}
汇总查询:
db.col.aggregate([
{"$unwind":"$types"},
{"$group":{
"_id":"$types.k",
"sum":{"$sum":"$types.v"},
"type":{"$sum":{"$cond":[{"$eq":["$id",1]},"$types.v",0]}}
}}
])