Mongodb Агрегат для уже сгруппированной отдельной комбинации (группировка внутри группировки)

Я использую mongoDB, в котором у меня есть коллекция следующего формата.

{name : x  city : AAA , status : active , radius : 1 }
{name : x  city : AAA , status : active , radius : 4  }
{name : x  city : AAA , status : inactive , radius : 7 }
{name : x  city : BBB , status : inactive , radius : 7 }
{name : Y  city : AAA , status : active , radius : 8 }
{name : Y  city : BBB , status : inactive , radius : 5 }
{name : Y  city : BBB , status : inactive , radius : 12 }
{name : Z  city : CCC , status : deleted , radius : 15 }

Теперь мне нужна уникальная комбинация имя и класс, и для этой комбинации также требуется подгруппа активного, неактивного и удаленного счетчика для поля статуса. таким образом, общий отчет о выпуске будет в формате ниже

Name  City  total  Active  Inactive deleted 
 X     AAA    3     2       1         0
 X     BBB    1     0       1         0
 Y     AAA    1     1       0         0
 Y     BBB    2     0       2         0
 Z     CCC    1     0       0         1

Поскольку я новичок в mongodb, может ли кто-нибудь предложить, есть ли способ получить требуемый формат вывода с помощью агрегата или любого другого метода с минимальным запросом?

Вы имеете в виду город вместо класс? Если да, пожалуйста, отредактируйте

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

Ответы 1

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

Вам потребуется просто один этап $group, сгруппированный по имени и городу, и условная сумма для каждого из полей active, inactive и deleted. Затем вы добавляете в конце этап $project, чтобы получить именно тот формат, который вам нужен.

db.collection.aggregate([
  {
    $group: {
      "_id": {
        name: "$name",
        city: "$city"
      },
      total: { 
        $sum: 1 
      },
      active: {
        $sum: {
          $cond: [ { $eq: [ "$status", "active" ] }, 1, 0 ]
        }
      },
      inactive: {
        $sum: {
          $cond: [ { $eq: [ "$status", "inactive" ] }, 1, 0 ]
        }
      },
      deleted: {
        $sum: {
          $cond: [ { $eq: [ "$status", "deleted" ] }, 1, 0 ]
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      name: "$_id.name",
      city: "$_id.city",
      total: "$total",
      active: "$active",
      inactive: "$inactive",
      deleted: "$deleted"
    }
  }
])

Превосходное использование $cond в целях группировки.

Buzz Moschetti 28.10.2018 20:56

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