Как я могу получить подсчитанные подсчеты при группировании по нескольким полям агрегации mongodb? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующие документы в моей коллекции кандидатов.

candidates = [
  {
    name: "amit",
    age: 21,
    city: 'pune'
  }
   {
    name: "rahul",
    age: 23,
    city: 'pune'
  },
   {
    name: "arjun",
    age: 21,
    city: 'pune'
  },
   {
    name: "rakesh",
    age: 23,
    city: 'pune'
  },
  {
    name: "amit",
    age: 22,
    city: 'nashik'
  }
]

Я хочу сгруппировать поля по возрасту и городу и посчитать документы, основываясь на их сумме, независимо друг от друга. Я попытался выполнить следующий запрос

candidate.aggregate([
  {$group: {_id: {age: '$age', city: '$city'}, count: {$sum: -1}}}
  {$sort: {count: -1}},
  {$limit: 10}
])

, который дает мне счет результатов по возрасту и городу. что я хочу вместо

{
  ages: [
    {
      age: 21,
      count: 2
    },
    {
      age: 23,
      count: 2
    },
    {
      age: 21,
      count: 1
    }
  ],
  cities: [
    {
      city: 'pune',
      count: 4
    },
    {
      city: 'nashik',
      count: 1
    }
  ]
}

спасибо за любую помощь.

1 Ответ

2 голосов
/ 03 апреля 2020

Вам нужно использовать $ facet stage, с $ групповым этапом для возраста и другим для города. Вот запрос:

db.collection.aggregate([
  {
    $facet: {
      byCity: [
        {
          $group: {
            _id: {
              city: "$city"
            },
            count: {
              $sum: 1
            }
          }
        },
        {
          $sort: {
            count: -1
          }
        },
        {
          $limit: 10
        }
      ],
      byAge: [
        {
          $group: {
            _id: {
              age: "$age",

            },
            count: {
              $sum: 1
            }
          }
        },
        {
          $sort: {
            count: -1
          }
        },
        {
          $limit: 10
        }
      ]
    }
  },
])

Пн go детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...