MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $sum Aggregation Pipeline-Operator

In MongoDB die $sum Der Aggregations-Pipeline-Operator berechnet die Summe numerischer Werte und gibt sie zurück.

Syntax

Die $sum Operator unterstützt zwei Syntaxen.

Syntax 1:

{ $sum: <expression> } 

Syntax 2:

{ $sum: [ <expression1>, <expression2> ... ]  } 

Die erste Syntax akzeptiert ein Argument und die zweite Syntax akzeptiert mehrere Argumente.

Bei Verwendung in $group Phase können Sie nur die erste Syntax verwenden. In diesem Fall $sum gibt die kollektive Summe aller numerischen Werte zurück, die sich aus der Anwendung des angegebenen Ausdrucks auf jedes Dokument in einer Gruppe von Dokumenten ergeben, die denselben Group-by-Key verwenden.

Beispiele für Syntax 1 (Einzelargument)

Hier sind ein paar Beispiele, die Syntax 1 verwenden.

Gruppierte Dokumente

Dieses Beispiel verwendet $sum in Verbindung mit $group um die Summe über eine Gruppe von Dokumenten zurückzugeben, die nach Schlüsseln gruppiert sind.

Angenommen, wir haben eine Sammlung namens pets mit folgenden Dokumenten:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }{ „_id“ :4, „Name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }{ „_id“ :5, „name“ :„Bruce“, „type“ :„Kangaroo“, „weight“ :100 }{ „ _id“ :6, „name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Kangaroo“, „Gewicht“ :200 }{ „_id“ :8, „Name“ :„Snap“, „Typ“ :„Katze“, „Gewicht“ :12 }{ „_id“ :9, „Name“ :„Ruff“, „Typ“ :„Hund“, „Gewicht“ :30 }

Wir können diese Dokumente nach ihrem type gruppieren Feld und verwenden Sie dann $sum um die Summe des weight zurückzugeben Feld für jede Gruppe:

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

Ergebnis:

{ "_id" :"Känguru", "sum" :430 }{ "_id" :"Katze", "sum" :27 }{ "_id" :"Hund", "sum" :60 } 

Arrays

Dieses Beispiel wendet $sum an zu einem einzelnen Dokument, das ein Feld mit einem Array von Werten enthält.

Diese Option ist nur verfügbar, wenn die Syntax mit einem einzigen Argument verwendet wird. Arrays werden ignoriert, wenn die Syntax mit mehreren Argumenten verwendet wird (mehr dazu weiter unten).

Angenommen, wir haben eine Sammlung namens players mit folgenden Dokumenten:

{ "_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“ }

Wir können $sum anwenden zu den scores Feld in jedem Dokument:

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

Ergebnis:

{ "_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 } 

In diesem Fall haben die ersten vier Dokumente die Summe der verschiedenen Zahlen zurückgegeben, die sich in ihren jeweiligen Arrays befanden.

Im Fall von Dokument 4 war dies dasselbe wie die Zahl, da es nur eine Zahl im Array gab.

Dokument 5 hat 0 zurückgegeben weil wir ein leeres Array bereitgestellt haben.

Dokument 6 hat 0 zurückgegeben weil wir null bereitgestellt haben als Argument.

Dokument 7 gab 0 zurück weil das Feld gar nicht existierte.

Beispiel für Syntax 2 (mehrere Argumente)

Die zweite Syntax beinhaltet die Bereitstellung von $sum mit mehr als einem Argument. $sum berechnet dann die Summe basierend auf allen gelieferten Argumenten.

Angenommen, wir haben eine Sammlung namens data mit folgenden Dokumenten:

{ "_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" :"Hey" } { "_id" :4, "a" :"Eins", "b" :"Zwei", "c" :"Drei", "d" :"Vier" }

Wir können $sum verwenden um die Summe von a zurückzugeben , b , c , und d Felder jedes Dokuments:

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

Ergebnis:

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

Dokument 1 gibt die Summe der Eingabewerte von 1 zurück , 2 , 3 , und 4 .

Die nächsten beiden Dokumente lieferten jedoch nur die Summe der Eingabewerte von 1 , 2 , und 3 . Die $sum Operator ignorierte ihr d Felder.

Das liegt daran, dass $sum ignoriert nicht numerische Werte. In diesem Fall wurde also "Hey" ignoriert in Dokument 3 und berechnete die Summe aus den restlichen (numerischen) Feldern.

Was Dokument 2 betrifft, ist es d Feld enthält ein Array. Wie bereits erwähnt, die $sum -Operator ignoriert Arrays, wenn die Syntax mit mehreren Argumenten verwendet wird. Genauer gesagt behandelt es Arrays als nicht numerische Werte, wenn es in diesem Zusammenhang verwendet wird, und $sum ignoriert nicht-numerische Werte.

Wenn alle Werte nicht numerisch sind, dann $sum gibt 0 zurück . Wir können dies anhand von Dokument 4 sehen.

Fehlende Felder

Bei Verwendung der Syntax mit mehreren Argumenten $sum ignoriert alle fehlenden Felder. Das heißt, wenn Sie ein Feld angeben, das nicht vorhanden ist, wird es ignoriert. Wenn keines der Felder vorhanden ist, wird 0 zurückgegeben .

Beispiel:

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

Ergebnis:

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

In diesem Fall habe ich ein zusätzliches Feld bereitgestellt ($e ), die in den Dokumenten nicht vorhanden ist. $sum berechnete die Summe basierend auf den verbleibenden Feldern, die tun existieren.

Folgendes passiert jedoch, wenn keine der Felder existieren:

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

Ergebnis:

{ „_id“ :1, „Ergebnis“ :0 }{ „_id“ :2, „Ergebnis“ :0 }{ „_id“ :3, „Ergebnis“ :0 }{ „_id“ :4, „ Ergebnis" :0 }

Das Ergebnis ist 0 für alle Dokumente.

Wie wir bereits gesehen haben, führt ein fehlendes Feld bei Verwendung der Ein-Argument-Syntax zu 0 .

Beispiel:

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

Ergebnis:

{ "_id" :"Cat", "sum" :0 }{ "_id" :"Hund", "sum" :0 }{ "_id" :"Känguru", "sum" :0 } 

Verfügbare Stufen

$sum ist in den folgenden Stufen verfügbar:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match Stufe, die einen $expr enthält Ausdruck