V MongoDB, $sum operátor agregačního kanálu vypočítá a vrátí součet číselných hodnot.
Syntaxe
$sum operátor podporuje dvě syntaxe.
Syntaxe 1:
{ $sum: <expression> } Syntaxe 2:
{ $sum: [ <expression1>, <expression2> ... ] } První syntaxe přijímá jeden argument a druhá syntaxe přijímá více argumentů.
Při použití ve $group fázi, můžete použít pouze první syntaxi. V tomto případě $sum vrátí souhrnný součet všech číselných hodnot, které jsou výsledkem použití zadaného výrazu na každý dokument ve skupině dokumentů, které sdílejí stejnou skupinu podle klíče.
Příklady syntaxe 1 (jediný argument)
Zde je několik příkladů, které používají syntaxi 1.
Skupinové dokumenty
Tento příklad používá $sum ve spojení s $group vrátit součet ve skupině dokumentů, které jsou seskupeny podle klíče.
Předpokládejme, že máme sbírku nazvanou pets s následujícími dokumenty:
{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }{ "_id" :4, "jméno" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Klokánek", "váha" :100 }{ " _id" :6, "name" :"Hop", "type" :"Klokánek", "váha" :130 }{ "_id" :7, "name" :"Punch", "type" :"Klokánek", "váha" :200 }{ "_id" :8, "jméno" :"Snap", "type" :"Kočka", "váha" :12 }{ "_id" :9, "jméno" :"Ruff", "type" :"Pes", "hmotnost" :30 }
Tyto dokumenty můžeme seskupit podle jejich type a poté použijte $sum vrátí součet weight pole pro každou skupinu:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$weight" }
}
}
]
) Výsledek:
{ "_id" :"Klokánek", "součet" :430 }{ "_id" :"Kočka", "součet" :27 }{ "_id" :"Pes", "součet" :60 } Pole
Tento příklad platí $sum do jednoho dokumentu, který obsahuje pole s polem hodnot.
Tato možnost je dostupná pouze při použití syntaxe jednoho argumentu. Při použití víceargumentové syntaxe jsou pole ignorována (více o tom níže).
Předpokládejme, že máme kolekci nazvanou players s následujícími dokumenty:
{ "_id" :1, "player" :"Homer", "skóre" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "skóre" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "hráč" :"Bart", "skóre" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "hráč" :"Brian", "skóre" :[ 7 ] }{ "_id" :5, "hráč" :"Farnsworth", "skóre" :[ ] }{ "_id" :6, "player" :"Meg", "scores" :null }{ "_id" :7, "player" :"Ron" }
Můžeme použít $sum do scores pole v každém dokumentu:
db.players.aggregate(
[
{
$project:
{
player: 1,
sum: { $sum: "$scores" }
}
}
]
)
Výsledek:
{ "_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 }
V tomto případě první čtyři dokumenty vrátily součet různých čísel, která byla v příslušných polích.
V případě dokumentu 4 to bylo stejné jako číslo, protože v poli bylo pouze jedno číslo.
Dokument 5 vrátil 0 protože jsme poskytli prázdné pole.
Dokument 6 vrátil 0 protože jsme poskytli null jako argument.
Dokument 7 vrátil 0 protože pole ani neexistovalo.
Příklad syntaxe 2 (více argumentů)
Druhá syntaxe zahrnuje poskytnutí $sum s více než jedním argumentem. $sum pak vypočítá součet na základě všech dodaných argumentů.
Předpokládejme, že máme kolekci nazvanou data s následujícími dokumenty:
{ "_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" :"Ahoj" } { "_id" :4, "a" :"Jedna", "b" :"Dva", "c" :"Tři", "d" :"Čtyři" }
Můžeme použít $sum vrátí součet a , b , c a d pole každého dokumentu:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Výsledek:
{ "_id" :1, "sum" :10 }{ "_id" :2, "součet" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " součet" :0 }
Dokument 1 vrací součet vstupních hodnot 1 , 2 , 3 a 4 .
Následující dva dokumenty však vrátily pouze součet vstupních hodnot 1 , 2 a 3 . $sum operátor ignoroval jejich d pole.
Důvodem je $sum ignoruje nečíselné hodnoty. Takže v tomto případě ignoroval "Hey" v dokumentu 3 a vypočítal součet ze zbývajících (číselných) polí.
Pokud jde o dokument 2, jeho d pole obsahuje pole. Jak již bylo zmíněno, $sum Při použití víceargumentové syntaxe operátor ignoruje pole. Přesněji řečeno, při použití v tomto kontextu považuje pole za nečíselné hodnoty a $sum ignoruje nečíselné hodnoty.
Pokud jsou všechny hodnoty nečíselné, pak $sum vrátí 0 . Můžeme to vidět v dokumentu 4.
Chybějící pole
Při použití víceargumentové syntaxe $sum ignoruje všechna chybějící pole. To znamená, že pokud zadáte pole, které neexistuje, bude je ignorovat. Pokud žádné z polí neexistuje, vrátí 0 .
Příklad:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Výsledek:
{ "_id" :1, "sum" :10 }{ "_id" :2, "součet" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " součet" :0 }
V tomto případě jsem poskytl další pole ($e ), který v dokumentech neexistuje. $sum vypočítal součet na základě zbývajících polí, která dělají existovat.
Co se však stane, když žádné z polí existují:
db.data.aggregate(
[
{
$project:
{
result: { $sum: [ "$x", "$y", "$z" ] }
}
}
]
)
Výsledek:
{ "_id" :1, "výsledek" :0 }{ "_id" :2, "výsledek" :0 }{ "_id" :3, "výsledek" :0 }{ "_id" :4, " výsledek" :0 }
Výsledek je 0 pro všechny dokumenty.
Jak jsme viděli dříve, při použití syntaxe s jedním argumentem vede chybějící pole k 0 .
Příklad:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$oops!" }
}
}
]
)
Výsledek:
{ "_id" :"Kočka", "součet" :0 }{ "_id" :"Pes", "sum" :0 }{ "_id" :"Klokánek", "součet" :0 } Dostupné fáze
$sum je k dispozici v následujících fázích:
$group$project$addFields$set$replaceRoot$replaceWith$matchfázi, která obsahuje$exprvýraz