Utilisation avancée de MongoDB

Les agrégations avec MongoDB

La méthode aggregate permet de faire des agrégations de données comme avec les GROUP BY en SQL. Cette méthode s'utilise comme ci-dessous :

CTRL+C pour copier, CTRL+V pour coller
1
db.collection.aggregate(pipeline, options)
db.collection.aggregate(pipeline, options)

Pour les pipelines, on peut utiliser des opérateurs très différents :

  • $match : pour filtrer le jeu de données

  • $sort : pour trier les résultats selon un certain ordre

  • $sum : faire la somme d'un attribut

  • $avg : faire la moyenne d'un attribut

  • $group : pour grouper des éléments qui ont le même ID

  • $unwind : permet de déconstruire un tableau imbriqué dans un document.

CTRL+C pour copier, CTRL+V pour coller
1
//match pour chercher les éléments ayant pour name "partyparrot"
2
db.reactions.aggregate([{$match:{name:"partyparrot"}}])
3
4
//sort pour trier les résultats par ordre décroissant (ici par ordre alphabétique)
5
db.reactions.aggregate([{$sort: {name:-1}}])
6
7
8
// Cette requête permet d'afficher combien d'emoji a reçu chaque utilisateur.
9
db.reactions.aggregate([ 
10
                         {$unwind:"$scores"}, 
11
                         {$group: {"_id":"$name", "score":{$sum: "$scores.pts"}}}, 
12
                         {$sort : {"score":-1}}
13
                       ])
14
15
/*
16
Pour illustrer ce que fait unwind, on peut dire que si l'on part de l'exemple ci-dessous :
17
*/
18
{ 
19
  "name":"aled",
20
  "score" : [ {"username":"u1","pts":5},
21
              {"username":"u2","pts":7},
22
              {"username":"u3","pts":9}
23
            ]
24
}
25
/*
26
on obtiendra le résultat suivant : 
27
*/
28
 {"name":"aled", "score" : {"username":"u1","pts":5} }
29
 {"name":"aled", "score" : {"username":"u2","pts":7} }
30
 {"name":"aled", "score" : {"username":"u3","pts":9} }
//match pour chercher les éléments ayant pour name "partyparrot"
db.reactions.aggregate([{$match:{name:"partyparrot"}}])

//sort pour trier les résultats par ordre décroissant (ici par ordre alphabétique)
db.reactions.aggregate([{$sort: {name:-1}}])


// Cette requête permet d'afficher combien d'emoji a reçu chaque utilisateur.
db.reactions.aggregate([ 
                         {$unwind:"$scores"}, 
                         {$group: {"_id":"$name", "score":{$sum: "$scores.pts"}}}, 
                         {$sort : {"score":-1}}
                       ])

/*
Pour illustrer ce que fait unwind, on peut dire que si l'on part de l'exemple ci-dessous :
*/
{ 
  "name":"aled",
  "score" : [ {"username":"u1","pts":5},
              {"username":"u2","pts":7},
              {"username":"u3","pts":9}
            ]
}
/*
on obtiendra le résultat suivant : 
*/
 {"name":"aled", "score" : {"username":"u1","pts":5} }
 {"name":"aled", "score" : {"username":"u2","pts":7} }
 {"name":"aled", "score" : {"username":"u3","pts":9} }
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Gerin-Roze Camille, 2017 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Réalisé avec Scenari (nouvelle fenêtre)