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 denscores
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 wirnull
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 vona
zurückzugeben ,b
,c
, undd
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
, und4
.Die nächsten beiden Dokumente lieferten jedoch nur die Summe der Eingabewerte von
1
,2
, und3
. Die$sum
Operator ignorierte ihrd
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
gibt0
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, wird0
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