MongoDB: как сгруппировать по нескольким полям


Вы можете использовать следующий синтаксис для группировки по нескольким полям и выполнения некоторой агрегации в MongoDB:

db.collection.aggregate([
 { $group : { _id :{field1:" $field1", field2:" $field2 "}, count :{ $sum :1}}}
])

В следующих примерах показано, как использовать этот синтаксис с набором команд со следующими документами:

db.teams.insertOne({team: " Mavs", position: " Guard", points: 31 })
db.teams.insertOne({team: " Mavs", position: " Guard", points: 22 })
db.teams.insertOne({team: " Mavs", position: " Forward", points: 19 })
db.teams.insertOne({team: " Rockets", position: " Guard", points: 26 })
db.teams.insertOne({team: " Rockets", position: " Forward", points: 33 })

Пример 1: группировка по нескольким полям и объединение

Мы можем использовать следующий код для группировки по «команде» и «позиции» и подсчету вхождений каждой группировки:

db.teams.aggregate([
 { $group : { _id :{team:" $team", position:" $position "}, count :{ $sum :1}}}
])

Это возвращает следующие результаты:

{ _id: { team: ' Rockets', position: ' Forward ' }, count: 1 }
{ _id: { team: ' Mavs', position: ' Guard ' }, count: 2 }
{ _id: { team: ' Mavs', position: ' Forward ' }, count: 1 }
{ _id: { team: ' Rockets', position: ' Guard ' }, count: 1 }

Мы также можем выполнить другую агрегацию. Например, мы могли бы сгруппировать по «команда» и «позиция» и найти сумму «очков» путем группировки:

db.teams.aggregate([
 { $group : { _id :{team:" $team", position:" $position "}, sumPoints :{ $sum :" $points "}}}
])

Это возвращает следующие результаты:

{ _id: { team: ' Rockets', position: ' Forward ' }, sumPoints: 33 }
{ _id: { team: ' Mavs', position: ' Guard ' }, sumPoints: 53 }
{ _id: { team: ' Mavs', position: ' Forward ' }, sumPoints: 19 }
{ _id: { team: ' Rockets', position: ' Guard ' }, sumPoints: 26 }

Это говорит нам:

  • Сумма очков, набранных игроками «Рокетс» в позиции «Вперед», составляет 33 .
  • Сумма очков, набранных игроками на «Мавс» в позиции «Гвардия», составляет 53 .

И так далее.

Пример 2: группировка по нескольким полям и объединение (затем сортировка)

Мы можем использовать следующий код для группировки по «команде» и положению и найти сумму «очков» путем группировки, а затем отсортировать результаты по «очкам» в порядке возрастания :

db.teams.aggregate([
 { $group : { _id :{team:" $team", position:" $position "}, sumPoints :{ $sum :" $points "}}},
 { $sort : { sumPoints :1}}
])

Это возвращает следующие результаты:

{ _id: { team: ' Mavs', position: ' Forward ' }, sumPoints: 19 }
{ _id: { team: ' Rockets', position: ' Guard ' }, sumPoints: 26 }
{ _id: { team: ' Rockets', position: ' Forward ' }, sumPoints: 33 }
{ _id: { team: ' Mavs', position: ' Guard ' }, sumPoints: 53 }

Вместо этого мы можем использовать -1 для сортировки результатов по точкам в порядке убывания :

db.teams.aggregate([
 { $group : { _id :{team:" $team", position:" $position "}, sumPoints :{ $sum :" $points "}}},
 { $sort : { sumPoints :-1}}
])

Это возвращает следующие результаты:

{ _id: { team: ' Mavs', position: ' Guard ' }, sumPoints: 53 }
{ _id: { team: ' Rockets', position: ' Forward ' }, sumPoints: 33 }
{ _id: { team: ' Rockets', position: ' Guard ' }, sumPoints: 26 }
{ _id: { team: ' Mavs', position: ' Forward ' }, sumPoints: 19 }

Примечание.Полную документацию по $group можно найти здесь .

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.