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 можно найти здесь .