In MongoDB is de $sum
aggregatiepijplijnoperator berekent en retourneert de som van numerieke waarden.
Syntaxis
De $sum
operator ondersteunt twee syntaxis.
Syntaxis 1:
{ $sum: <expression> }
Syntaxis 2:
{ $sum: [ <expression1>, <expression2> ... ] }
De eerste syntaxis accepteert één argument en de tweede syntaxis accepteert meerdere argumenten.
Bij gebruik in de $group
stadium, kunt u alleen de eerste syntaxis gebruiken. In dit geval, $sum
geeft de collectieve som terug van alle numerieke waarden die het resultaat zijn van het toepassen van de opgegeven uitdrukking op elk document in een groep documenten die dezelfde groep op sleutel delen.
Voorbeelden van syntaxis 1 (enkel argument)
Hier zijn een paar voorbeelden die syntaxis 1 gebruiken.
Gegroepeerde documenten
Dit voorbeeld gebruikt $sum
in combinatie met $group
om de som terug te geven over een groep documenten die op sleutel zijn gegroepeerd.
Stel dat we een verzameling hebben met de naam pets
met de volgende documenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 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", "weight" : 200 } { "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 } { "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
We kunnen deze documenten groeperen op hun type
veld, en gebruik dan $sum
om de som van het weight
terug te geven veld voor elke groep:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$weight" }
}
}
]
)
Resultaat:
{ "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }
Arrays
Dit voorbeeld is van toepassing op $sum
naar een enkel document dat een veld met een reeks waarden bevat.
Deze optie is alleen beschikbaar bij gebruik van de syntaxis voor één argument. Arrays worden genegeerd bij gebruik van de syntaxis met meerdere argumenten (meer hierover hieronder).
Stel dat we een verzameling hebben met de naam players
met de volgende documenten:
{ "_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" }
We kunnen $sum
apply toepassen naar de scores
veld in elk document:
db.players.aggregate(
[
{
$project:
{
player: 1,
sum: { $sum: "$scores" }
}
}
]
)
Resultaat:
{ "_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 dit geval gaven de eerste vier documenten de som terug van de verschillende getallen die in hun respectievelijke arrays stonden.
In het geval van document 4 was dit hetzelfde als het nummer, omdat er maar één nummer in de array was.
Document 5 retourneerde 0
omdat we een lege array hebben opgegeven.
Document 6 retourneerde 0
omdat we null
. hebben opgegeven als het argument.
Document 7 retourneerde 0
omdat het veld niet eens bestond.
Voorbeeld van syntaxis 2 (meerdere argumenten)
De tweede syntaxis omvat het verstrekken van $sum
met meer dan één argument. $sum
berekent vervolgens de som op basis van alle opgegeven argumenten.
Stel dat we een verzameling hebben met de naam data
met de volgende documenten:
{ "_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" : "One", "b" : "Two", "c" : "Three", "d" : "Four" }
We kunnen $sum
. gebruiken om de som van de a
. te retourneren , b
, c
, en d
velden van elk document:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "sum" : 10 } { "_id" : 2, "sum" : 6 } { "_id" : 3, "sum" : 6 } { "_id" : 4, "sum" : 0 }
Document 1 retourneert de som van de invoerwaarden van 1
, 2
, 3
, en 4
.
De volgende twee documenten retourneerden echter alleen de som van de invoerwaarden van 1
, 2
, en 3
. De $sum
operator negeerde hun d
velden.
Dit komt omdat $sum
negeert niet-numerieke waarden. Dus in dit geval negeerde het "Hey"
in document 3 en berekende de som uit de overige (numerieke) velden.
Wat betreft document 2, het is d
veld bevat een array. Zoals gezegd, de $sum
operator negeert arrays bij gebruik van de syntaxis met meerdere argumenten. Meer precies, het behandelt arrays als niet-numerieke waarden wanneer ze in deze context worden gebruikt, en $sum
negeert niet-numerieke waarden.
Als alle waarden niet-numeriek zijn, dan $sum
retourneert 0
. We kunnen dit zien met document 4.
Ontbrekende velden
Bij gebruik van de syntaxis met meerdere argumenten, $sum
negeert eventuele ontbrekende velden. Dat wil zeggen, als u een veld opgeeft dat niet bestaat, wordt dit genegeerd. Als geen van de velden bestaat, retourneert het 0
.
Voorbeeld:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "sum" : 10 } { "_id" : 2, "sum" : 6 } { "_id" : 3, "sum" : 6 } { "_id" : 4, "sum" : 0 }
In dit geval heb ik een extra veld ($e
) die niet in de documenten voorkomt. $sum
berekende de som op basis van de resterende velden die doen bestaan.
Dit is echter wat er gebeurt als geen van de velden bestaat:
db.data.aggregate(
[
{
$project:
{
result: { $sum: [ "$x", "$y", "$z" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "result" : 0 } { "_id" : 2, "result" : 0 } { "_id" : 3, "result" : 0 } { "_id" : 4, "result" : 0 }
Het resultaat is 0
voor alle documenten.
Zoals we eerder zagen, resulteert bij het gebruik van de syntaxis van één argument een ontbrekend veld in 0
.
Voorbeeld:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$oops!" }
}
}
]
)
Resultaat:
{ "_id" : "Cat", "sum" : 0 } { "_id" : "Dog", "sum" : 0 } { "_id" : "Kangaroo", "sum" : 0 }
Beschikbare stadia
$sum
is beschikbaar in de volgende fasen:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
fase met een$expr
uitdrukking