MongoDB : Comment regrouper par plusieurs champs
Vous pouvez utiliser la syntaxe suivante pour regrouper plusieurs champs et effectuer une agrégation dans MongoDB :
db.collection.aggregate([ {$group : {_id:{field1:"$field1", field2:"$field2"}, count:{$sum:1}}} ])
Les exemples suivants montrent comment utiliser cette syntaxe avec une équipe de collection avec les documents suivants :
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})
Exemple 1 : regrouper par plusieurs champs et agréger
Nous pouvons utiliser le code suivant pour regrouper par « équipe » et « position » et compter les occurrences de chaque regroupement :
db.teams.aggregate([ {$group : {_id:{team:"$team", position:"$position"}, count:{$sum:1}}} ])
Cela renvoie les résultats suivants :
{ _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 }
Nous pourrions également effectuer une agrégation différente. Par exemple, nous pourrions regrouper par « équipe » et position » et trouver la somme des « points » en regroupant :
db.teams.aggregate([ {$group : {_id:{team:"$team", position:"$position"}, sumPoints:{$sum:"$points"}}} ])
Cela renvoie les résultats suivants :
{ _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 }
Cela nous dit :
- La somme des points marqués par les joueurs des ‘Rockets’ en position ‘Avant’ est de 33 .
- La somme des points marqués par les joueurs des ‘Mavs’ en position ‘Garde’ est de 53 .
Et ainsi de suite.
Exemple 2 : regrouper par plusieurs champs et agréger (puis trier)
Nous pouvons utiliser le code suivant pour regrouper par « équipe » et position » et trouver la somme des « points » par regroupement, puis trier les résultats par « points » par ordre croissant :
db.teams.aggregate([ {$group : {_id:{team:"$team", position:"$position"}, sumPoints:{$sum:"$points"}}}, {$sort : {sumPoints:1}} ])
Cela renvoie les résultats suivants :
{ _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 }
Nous pouvons utiliser -1 pour trier les résultats par points par ordre décroissant :
db.teams.aggregate([ {$group : {_id:{team:"$team", position:"$position"}, sumPoints:{$sum:"$points"}}}, {$sort : {sumPoints:-1}} ])
Cela renvoie les résultats suivants :
{ _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 }
Remarque : Vous pouvez trouver la documentation complète de $group ici .