Dans MongoDB, le $avg
l'opérateur de pipeline d'agrégation calcule et renvoie la valeur moyenne des valeurs numériques spécifiées.
Syntaxe
Le $avg
L'opérateur prend en charge deux syntaxes.
Syntaxe 1 :
{ $avg: <expression> }
Syntaxe 2 :
{ $avg: [ <expression1>, <expression2> ... ] }
La première syntaxe accepte un argument et la deuxième syntaxe accepte plusieurs arguments.
Lorsqu'il est utilisé dans le $group
étape, vous ne pouvez utiliser que la première syntaxe. Dans ce cas, $avg
renvoie la moyenne collective de toutes les valeurs numériques résultant de l'application d'une expression spécifiée à chaque document dans un groupe de documents partageant le même groupe par clé.
Exemples de syntaxe 1 (argument unique)
Voici quelques exemples qui utilisent la syntaxe 1.
Documents groupés
Cet exemple utilise $avg
en conjonction avec $group
pour renvoyer la moyenne d'un groupe de documents regroupés par clé.
Supposons que nous ayons une collection appelée pets
avec les documents suivants :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Chien", "poids" :10 }{ "_id" :3, "nom" :"Miaou", "type" :"Chat", "poids" :7 }{ "_id" :4, "nom" :"Scratch", "type" :"Chat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Kangaroo", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Kangaroo", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Chien", "poids" :30 }
Nous pouvons regrouper ces documents par leur type
champ, puis utilisez $avg
pour retourner le poids moyen de chaque groupe :
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
average_weight: { $avg: "$weight" }
}
}
]
)
Résultat :
{ "_id" :"Chien", "average_weight" :20 }{ "_id" :"Chat", "average_weight" :9 }{ "_id" :"Kangourou", "average_weight" :143.33333333333334 }Tableaux
Cet exemple applique
$avg
à un seul document qui contient un champ avec un tableau de valeurs.Cette option n'est disponible que lors de l'utilisation de la syntaxe à argument unique. Les tableaux sont ignorés lors de l'utilisation de la syntaxe multi-arguments (plus d'informations ci-dessous).
Supposons que nous ayons une collection appelée
players
avec les documents suivants :{ "_id" :1, "player" :"Homer", "scores" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "scores" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "player" :"Bart", "scores" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "scores" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "scores" :[ ] }{ "_id" :6, "player" :"Meg", "scores" :null }{ "_id" :7, "player" :"Ron" }Nous pouvons appliquer
$avg
auxscores
champ dans chaque document :db.players.aggregate( [ { $project: { player: 1, averageScore: { $avg: "$scores" } } } ] )
Résultat :
{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.666666666666666 }{ "_id" :3, "player" :"Bart", "averageScore" :6.333333333333333 }{ "_id" :4, "player" :"Brian", "averageScore" :7 }{ "_id" :5, "player" :"Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null }Dans ce cas, les quatre premiers documents ont renvoyé la moyenne des différents nombres qui se trouvaient dans leurs tableaux respectifs.
Dans le cas du document 4, c'était le même que le nombre, car il n'y avait qu'un seul nombre dans le tableau.
Le document 5 a renvoyé
null
car nous avons fourni un tableau vide.Le document 6 a renvoyé
null
car nous avons fourninull
comme argument.Le document 7 a renvoyé
null
car le champ n'existait même pas.Exemple de syntaxe 2 (arguments multiples)
La deuxième syntaxe consiste à fournir
$avg
avec plus d'un argument.$avg
calcule ensuite la moyenne en fonction de tous les arguments fournis.Supposons que nous ayons une collection appelée
data
avec les documents suivants :{ "_id" :1, "a" :1, "b" :2, "c" :3, "d" :4 }{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 4 ] }{ "_id" :3, "a" :1, "b" :2, "c" :3, "d" :"Salut" } { "_id" :4, "a" :"Un", "b" :"Deux", "c" :"Trois", "d" :"Quatre" }Nous pouvons utiliser
$avg
pour retourner la moyenne dua
,b
,c
, etd
champs de chaque document :db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d" ] } } } ] )
Résultat :
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " moy" :null }Le document 1 renvoie la moyenne des valeurs d'entrée de
1
,2
,3
, et4
.Cependant, les deux documents suivants n'ont renvoyé que la moyenne des valeurs d'entrée de
1
,2
, et3
. Le$avg
l'opérateur a ignoré sond
des champs.C'est parce que
$avg
ignore les valeurs non numériques. Donc, dans ce cas, il a ignoré"Hey"
dans le document 3 et calculé la moyenne à partir des champs (numériques) restants.Quant au document 2, son
d
champ contient un tableau. Comme mentionné, le$avg
L'opérateur ignore les tableaux lors de l'utilisation de la syntaxe multi-arguments. Plus précisément, il traite les tableaux comme des valeurs non numériques lorsqu'ils sont utilisés dans ce contexte, et$avg
ignore les valeurs non numériques.Si toutes les valeurs ne sont pas numériques, alors
$avg
renvoienull
. On peut le voir avec le document 4.Champs manquants
Lors de l'utilisation de la syntaxe multi-arguments,
$avg
ignore les champs manquants. Autrement dit, si vous fournissez un champ qui n'existe pas, il l'ignore. Si aucun des champs n'existe, alors il renvoienull
.Exemple :
db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Résultat :
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " moy" :null }Dans ce cas, j'ai fourni un champ supplémentaire (
$e
) qui n'existe pas dans les documents.$avg
calculé la moyenne en fonction des champs restants qui font existent.Cependant, voici ce qui se passe lorsque aucun des champs existent :
db.data.aggregate( [ { $project: { result: { $avg: [ "$x", "$y", "$z" ] } } } ] )
Résultat :
{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }{ "_id" :4, " résultat" :null }Le résultat est
null
pour tous les documents.Comme nous l'avons vu précédemment, lors de l'utilisation de la syntaxe à argument unique, un champ manquant entraîne
null
.Exemple :
db.pets.aggregate( [ { $group: { _id: "$type", avg: { $avg: "$oops!" } } } ] )
Résultat :
{ "_id" :"Kangourou", "avg" :null }{ "_id" :"Chat", "avg" :null }{ "_id" :"Chien", "avg" :null }Étapes disponibles
$avg
est disponible dans les étapes suivantes :
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
étape qui inclut un$expr
expression