MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Opérateur de pipeline d'agrégation $avg MongoDB

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 aux scores 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 fourni null 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 du a , b , c , et d 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 , et 4 .

Cependant, les deux documents suivants n'ont renvoyé que la moyenne des valeurs d'entrée de 1 , 2 , et 3 . Le $avg l'opérateur a ignoré son d 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 renvoie null . 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 renvoie null .

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