V MongoDB, $stdDevPop
operátor agregačního potrubí vypočítá směrodatnou odchylku základního souboru svých vstupních hodnot.
Vstupní hodnoty mohou být ze skupiny dokumentů (tj. dokumentů, které jsou seskupeny podle stejného klíče), nebo to může být více polí v rámci jednoho dokumentu.
Syntaxe
$stdDevPop
operátor podporuje dvě syntaxe.
Syntaxe 1:
{ $stdDevPop: <expression> }
Syntaxe 2:
{ $stdDevPop: [ <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ě $stdDevPop
vrátí směrodatnou odchylku populace zadaného výrazu pro skupinu 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á $stdDevPop
ve spojení s $group
vrátit směrodatnou odchylku ve skupině dokumentů, které jsou seskupeny podle klíče.
Předpokládejme, že máme sbírku nazvanou stonks
s následujícími dokumenty:
{ "_id" :1, "ticker" :"gme", "cena" :10 }{ "_id" :2, "ticker" :"gme", "cena" :40 }{ "_id" :3, "ticker" :"gme", "cena" :90 }{ "_id" :4, "ticker" :"gme", "cena" :180 }{ "_id" :5, "ticker" :"gme" ", "cena" :290 }{ "_id" :6, "ticker" :"gme", "cena" :390 }{ "_id" :7, "ticker" :"gme", "cena" :190 } { "_id" :8, "ticker" :"gme", "cena" :90 }{ "_id" :9, "ticker" :"gme", "cena" :10 }{ "_id" :10, " ticker" :"jnj", "cena" :131 }{ "_id" :11, "ticker" :"jnj", "cena" :133 }{ "_id" :12, "ticker" :"jnj", " cena" :138 }{ "_id" :13, "ticker" :"jnj", "cena" :141 }{ "_id" :14, "ticker" :"jnj", "cena" :145 }{ "_id " :15, "ticker" :"jnj", "cena" :150 }{ "_id" :16, "ticker" :"jnj", "cena" :154 }{ "_id" :17, "ticker" :"jnj", "price" :156 }{ "_id" :18, "ticker" :"jnj", "price" :160 }
Tyto dokumenty můžeme seskupit podle jejich ticker
a poté použijte $stdDevPop
vrátit standardní odchylku populace price
pole pro každou skupinu:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Výsledek:
{ "_id" :"gme", "standardDeviation" :123.7380746218039 }{ "_id" :"jnj", "standardDeviation" :9.752492558885207 }
Můžeme vidět, že gme
má mnohem vyšší směrodatnou odchylku než jnj
.
Pole
Tento příklad platí $stdDevPop
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 }
Můžeme použít $stdDevPop
do scores
pole v každém dokumentu:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Výsledek:
{ "_id" :1, "standardDeviation" :2,849991049037143 }{ "_id" :2, "standardDeviation" :6,968181653455625 }{ "_id" :3, "standardní odchylka" :4908 :45 standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }
V tomto případě první tři dokumenty vrátily standardní odchylku pro různá čísla, která byla v příslušných polích.
Výsledkem dokumentu 4 byla standardní odchylka 0
. Je to proto, že jsme v poli poskytli pouze jedno číslo.
Dokument 5 vrátil null
protože jsme poskytli prázdné pole.
Dokument 6 vrátil null
protože jsme poskytli null
jako argument.
Příklad syntaxe 2 (více argumentů)
Druhá syntaxe zahrnuje poskytnutí $stdDevPop
s více než jedním argumentem. $stdDevPop
poté vypočítá směrodatnou odchylku 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" }
Můžeme použít $stdDevPop
vrátit standardní odchylku populace pro a
, b
, c
a d
pole každého dokumentu:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Výsledek:
{ "_id" :1, "výsledek" :1,118033988749895 }{ "_id" :2, "výsledek" :0,816496580927726 }{ "_id" :3, "výsledek" :0,8709649Dokument 1 vrací směrodatnou odchylku na základě vstupních hodnot
1
,2
,3
a4
.Poslední dva dokumenty však vrátily pouze standardní odchylku pro vstupní hodnoty
1
,2
a3
.$stdDevPop
operátor ignoroval jejichd
pole.Proč tomu tak je?
Funguje to tak, že
$stdDevPop
ignoruje nečíselné hodnoty. Takže v tomto případě ignoroval"Hey"
v dokumentu 3 a vypočítal standardní odchylku populace ze zbývajících (číselných) polí.Pokud jde o dokument 2, jeho
d
pole obsahuje pole. Jak již bylo zmíněno,$stdDevPop
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 jak bylo zmíněno,$stdDevPop
ignoruje nečíselné hodnoty.Pokud jsou všechny hodnoty nečíselné, pak
$stdDevPop
vrátínull
.Chybějící pole
Při použití víceargumentové syntaxe
$stdDevPop
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ínull
.Příklad:
db.data.aggregate( [ { $project: { result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Výsledek:
{ "_id" :1, "výsledek" :1,118033988749895 }{ "_id" :2, "výsledek" :0,816496580927726 }{ "_id" :3, "výsledek" :0,8709649V tomto případě jsem poskytl další pole (
$e
), který v dokumentu neexistuje.$stdDevPop
vypočítal směrodatnou odchylku 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: { $stdDevPop: [ "$x", "$y", "$z" ] } } } ] )
Výsledek:
{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }Výsledek je
null
pro všechny dokumenty.Při použití syntaxe s jedním argumentem má chybějící pole za následek
null
.Příklad:
db.stonks.aggregate( [ { $group: { _id: "$ticker", standardDeviation: { $stdDevPop: "$oops!" } } } ] )
Výsledek:
{ "_id" :"gme", "standardDeviation" :null }{ "_id" :"jnj", "standardDeviation" :null }Dostupné fáze
$stdDevPop
je k dispozici v následujících fázích:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
fázi, která obsahuje$expr
výraz
Vypočítejte vzorovou směrodatnou odchylku
Viz MongoDB $stdDevSamp
pokud potřebujete získat vzorek standardní odchylka, na rozdíl od populace standardní odchylka. Tento operátor je užitečný, pokud vaše hodnoty zahrnují vzorek populace dat, ze kterých lze zobecnit populaci.