Многоуровневая группа MongoDB

У меня есть исходные данные:

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. Как правильно это сделать?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
142
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы сказали, это можно сделать двумя группами, поэтому давайте начнем с ввода некоторых данных в 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}]}

Charles R 09.08.2018 11:27

Отлично, это была именно та галочка, которую я искал;)

Charles R 09.08.2018 12:05

Другие вопросы по теме