У меня есть исходные данные:
Brand | Model | Number
Peugeot | 208 | 1
Peugeot | 4008 | 2
Renault | Clio | 3
Renault | Megane | 4
Я бы хотел получить оба:
сумма для каждой марки
глобальная сумма
Вот мой ожидаемый результат:
Brand | Number
Peugeot | 3
Renault | 7
Total | 10
Я думаю, мне нужно создать две операции $group
и установить Total с помощью $literal
.
Как правильно это сделать?
Как вы сказали, это можно сделать двумя группами, поэтому давайте начнем с ввода некоторых данных в mongo, аналогичных вводу в вашем примере:
> db.cars.insertMany([
{ "Brand" : "Peugeot", "Model" : "208", "Number": 1 },
{ "Brand" : "Peugeot", "Model" : "4008", "Number": 2 },
{ "Brand" : "Renault", "Model" : "Clio", "Number": 3 },
{ "Brand" : "Renault", "Model" : "Megane", "Number": 4 }
]);
Теперь, когда мы вставили все наши автомобили, мы можем затем агрегировать их, используя 2 оператора агрегирования групп:
db.cars.aggregate([
{ $group : { "_id" : "$Brand", "Number" : { $sum : "$Number" }}},
{ $group : { "_id" : null, "Rows" : { $push : { "Brand" : "$$ROOT._id", "Number" : "$Number" } }, "Total" : {$sum : "$Number" } }}
])
Это даст нам следующий результат
{
"_id" : null,
"Rows" : [
{
"Brand" : "Renault",
"Number" : 7
},
{
"Brand" : "Peugeot",
"Number" : 3
}
],
"Total" : 10
}
Затем мы можем очистить его с помощью проекции
db.cars.aggregate([
{ "$group" : { "_id" : "$Brand", "Number" : { $sum : "$Number" }}},
{ "$group" : { "_id" : null, "Rows" : { $push : { "Brand" : "$$ROOT._id", "Number" : "$Number" } }, "Total" : {$sum : "$Number" } } },
{ "$project" : { "_id" : 0, "Data" : { "$concatArrays" : [ "$Rows", [ { "Brand": { $literal : "Total" }, "Number" : "$Total" } ] ] } } }
])
Дает нам следующий результат
{
"Data" : [
{
"Brand" : "Renault",
"Number" : 7
},
{
"Brand" : "Peugeot",
"Number" : 3
},
{
"Brand" : "Total",
"Number" : 10
}
]
}
Отлично, это была именно та галочка, которую я искал;)
Это работает, но я ожидал чего-то вроде этого: {"_id": null, "Rows": [{"Brand": "Renault", "Number": 7}, {"Brand": "Peugeot", "Number" : 3} {"Бренд": "Всего", "Число": 10}]}