V MongoDB, $stdDevSamp
operátor agregačního potrubí vypočítá vzorovou směrodatnou odchylku 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.
$stdDevSamp
je podobný $stdDevPop
. Rozdíl je v tom, že $stdDevSamp
vypočítá vzorek standardní odchylka, zatímco $stdDevPop
vypočítá populaci standardní odchylka.
Proto použijte $stdDevSamp
pokud vaše hodnoty zahrnují vzorek populace dat, ze kterých lze zobecnit populaci. Pokud hodnoty představují celou populaci dat nebo si nepřejete zobecňovat větší populaci, použijte $stdDevPop
místo toho.
Syntaxe
$stdDevSamp
operátor podporuje dvě syntaxe.
Syntaxe 1:
{ $stdDevSamp: <expression> }
Syntaxe 2:
{ $stdDevSamp: [ <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ě $stdDevSamp
vrátí vzorovou směrodatnou odchylku 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á $stdDevSamp
ve spojení s $group
vrátit vzorovou 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", "price" : 10 } { "_id" : 2, "ticker" : "gme", "price" : 40 } { "_id" : 3, "ticker" : "gme", "price" : 90 } { "_id" : 4, "ticker" : "gme", "price" : 180 } { "_id" : 5, "ticker" : "gme", "price" : 290 } { "_id" : 6, "ticker" : "gme", "price" : 390 } { "_id" : 7, "ticker" : "gme", "price" : 190 } { "_id" : 8, "ticker" : "gme", "price" : 90 } { "_id" : 9, "ticker" : "gme", "price" : 10 } { "_id" : 10, "ticker" : "jnj", "price" : 131 } { "_id" : 11, "ticker" : "jnj", "price" : 133 } { "_id" : 12, "ticker" : "jnj", "price" : 138 } { "_id" : 13, "ticker" : "jnj", "price" : 141 } { "_id" : 14, "ticker" : "jnj", "price" : 145 } { "_id" : 15, "ticker" : "jnj", "price" : 150 } { "_id" : 16, "ticker" : "jnj", "price" : 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 $stdDevSamp
vrátíte vzorovou směrodatnou odchylku price
pole pro každou skupinu:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$price" }
}
}
]
)
Výsledek:
{ "_id" : "gme", "result" : 131.24404748406687 } { "_id" : "jnj", "result" : 10.344080432788612 }
Můžeme vidět, že gme
má mnohem vyšší vzorovou směrodatnou odchylku než jnj
.
Pole
Tento příklad platí $stdDevSamp
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", "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 }
Můžeme použít $stdDevSamp
do scores
pole v každém dokumentu:
db.players.aggregate(
[
{
$project:
{
result: { $stdDevSamp: "$scores" }
}
}
]
)
Výsledek:
"{ "_id" : 1, "result" : 3.0783421635988546 } { "_id" : 2, "result" : 7.633260552782583 } { "_id" : 3, "result" : 5.988878581726855 } { "_id" : 4, "result" : null } { "_id" : 5, "result" : null } { "_id" : 6, "result" : null }
V tomto případě první tři dokumenty vrátily vzorovou směrodatnou odchylku pro různá čísla, která byla v jejich příslušných polích.
Výsledkem dokumentu 4 byla standardní odchylka null
. Je to proto, že jsme zadali pouze jedno číslo v poli. Pokud bychom použili $stdDevPop
, vrátilo by to 0
.
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í $stdDevSamp
s více než jedním argumentem. $stdDevSamp
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" : "Hey" }
Můžeme použít $stdDevSamp
vrátit vzorovou směrodatnou odchylku a
, b
, c
a d
pole každého dokumentu:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Výsledek:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
Výsledek prvního dokumentu je založen na vstupních hodnotách 1
, 2
, 3
a 4
.
Poslední dva dokumenty však vedly pouze k 1
, 2
a 3
je hodnocen. $stdDevSamp
operátor ignoroval jejich d
pole.
$stdDevSamp
ignoruje nečíselné hodnoty. Takže v tomto případě ignoroval "Hey"
v dokumentu 3 a vypočítal vzorovou směrodatnou odchylku ze zbývajících (číselných) polí.
Pokud jde o dokument 2, jeho d
pole obsahuje pole. Jak již bylo zmíněno, $stdDevSamp
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, $stdDevSamp
ignoruje nečíselné hodnoty.
Pokud jsou všechny hodnoty nečíselné, pak $stdDevSamp
vrátí null
.
Chybějící pole
Při použití víceargumentové syntaxe $stdDevSamp
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: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Výsledek:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
V tomto případě jsem poskytl další pole ($e
), který v dokumentu neexistuje. $stdDevSamp
vypočítal vzorovou 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: { $stdDevSamp: [ "$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",
result: { $stdDevSamp: "$oops!" }
}
}
]
)
Výsledek:
{ "_id" : "gme", "result" : null } { "_id" : "jnj", "result" : null }
Dostupné fáze
$stdDevSamp
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