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 :
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} }