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]}}
}}
])