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

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

Dans MongoDB, le $sum l'opérateur de pipeline d'agrégation calcule et renvoie la somme des valeurs numériques.

Syntaxe

La $sum L'opérateur prend en charge deux syntaxes.

Syntaxe 1 :

{ $sum: <expression> } 

Syntaxe 2 :

{ $sum: [ <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, $sum renvoie la somme collective de toutes les valeurs numériques résultant de l'application de l'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 $sum en conjonction avec $group pour renvoyer la somme sur 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 $sum pour retourner la somme des weight champ pour chaque groupe :

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$weight" }
          }
     }
   ]
) 

Résultat :

{ "_id" :"Kangourou", "sum" :430 }{ "_id" :"Chat", "sum" :27 }{ "_id" :"Chien", "sum" :60 } 

Tableaux

Cet exemple applique $sum à 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 $sum aux scores champ dans chaque document :

db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            sum: { $sum: "$scores" }
          }
     }
   ]
) 

Résultat :

{ "_id" :1, "player" :"Homer", "sum" :29 }{ "_id" :2, "player" :"Marge", "sum" :52 }{ "_id" :3, "player" :"Bart", "sum" :38 }{ "_id" :4, "player" :"Brian", "sum" :7 }{ "_id" :5, "player" :"Farnsworth ", "sum" :0 }{ "_id" :6, "player" :"Meg", "sum" :0 }{ "_id" :7, "player" :"Ron", "sum" :0 } 

Dans ce cas, les quatre premiers documents ont renvoyé la somme 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é 0 car nous avons fourni un tableau vide.

Le document 6 a renvoyé 0 car nous avons fourni null comme argument.

Le document 7 a renvoyé 0 car le champ n'existait même pas.

Exemple de syntaxe 2 (arguments multiples)

La deuxième syntaxe consiste à fournir $sum avec plus d'un argument. $sum calcule ensuite la somme 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 $sum pour retourner la somme des a , b , c , et d champs de chaque document :

db.data.aggregate(
   [
     {
       $project:
          {
            sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Résultat :

{ "_id" :1, "sum" :10 }{ "_id" :2, "sum" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " somme" :0 }

Le document 1 renvoie la somme des valeurs d'entrée de 1 , 2 , 3 , et 4 .

Cependant, les deux documents suivants n'ont renvoyé que la somme des valeurs d'entrée de 1 , 2 , et 3 . La $sum l'opérateur a ignoré son d des champs.

C'est parce que $sum ignore les valeurs non numériques. Donc, dans ce cas, il a ignoré "Hey" dans le document 3 et calculé la somme à partir des champs (numériques) restants.

Quant au document 2, son d champ contient un tableau. Comme mentionné, le $sum 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 $sum ignore les valeurs non numériques.

Si toutes les valeurs ne sont pas numériques, alors $sum renvoie 0 . On peut le voir avec le document 4.

Champs manquants

Lors de l'utilisation de la syntaxe multi-arguments, $sum 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 0 .

Exemple :

db.data.aggregate(
   [
     {
       $project:
          {
            sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Résultat :

{ "_id" :1, "sum" :10 }{ "_id" :2, "sum" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " somme" :0 }

Dans ce cas, j'ai fourni un champ supplémentaire ($e ) qui n'existe pas dans les documents. $sum calculé la somme en fonction des champs restants qui font existent.

Cependant, voici ce qui se passe lorsque aucun des champs existent :

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $sum: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Résultat :

{ "_id" :1, "result" :0 }{ "_id" :2, "result" :0 }{ "_id" :3, "result" :0 }{ "_id" :4, " résultat" :0 }

Le résultat est 0 pour tous les documents.

Comme nous l'avons vu précédemment, lors de l'utilisation de la syntaxe à argument unique, un champ manquant donne 0 .

Exemple :

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            sum: { $sum: "$oops!" }
          }
     }
   ]
) 

Résultat :

{ "_id" :"Chat", "sum" :0 }{ "_id" :"Chien", "sum" :0 }{ "_id" :"Kangourou", "sum" :0 } 

Étapes disponibles

$sum est disponible dans les étapes suivantes :

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match étape qui inclut un $expr expression