MongoDB在单个查询中返回subTotal和total

时间:2018-01-19 00:08:53

标签: mongodb aggregation-framework

我在集合中有这些数据:

{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是动态的,所以我不会事先知道这些值。

谢谢!

1 个答案:

答案 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]}}
  }}
])
相关问题