mongodb Агрегирование для уже сгруппированной отдельной комбинации (группировка внутри группировки) - PullRequest
0 голосов
/ 28 октября 2018

Я использую 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 и class и для этой комбинациитакже требуется подгруппа активного, неактивного и удаленного счетчика для поля состояния.таким образом, общий выходной отчет будет иметь следующий формат:

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

1 Ответ

0 голосов
/ 28 октября 2018

Вам потребуется просто один $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"
    }
  }
])
...