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 .

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *