MongoDB возвращает подытог и итог в одном запросе

У меня есть эти данные в коллекции:

{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:1, types:{'A':12, 'B':5, 'C':12, 'sumA':20,'sumB':20,'sumC':52}}

Я могу сделать это, вызвав 2 отдельных запроса. Один запрос, содержащий

 {$match: {id:1}}

И тот, у которого нет опции $match. Но я хотел бы знать, можно ли это сделать одним запросом.

Изменить: типы A,B и C являются динамическими, поэтому я не буду знать значения заранее.

Спасибо!

1 ответ

Решение

Вы можете использовать ниже агрегационный запрос.

$group агрегация с $sum рассчитать общее количество и $cond ограничить количество для конкретного идентификатора.

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]}}
  }}
])
Другие вопросы по тегам