W MongoDB $stdDevSamp
Operator potoku agregacji oblicza odchylenie standardowe próbki wartości wejściowych.
Wartości wejściowe mogą pochodzić z grupy dokumentów (tj. dokumentów pogrupowanych według tego samego klucza) lub mogą być wieloma polami w jednym dokumencie.
$stdDevSamp
jest podobny do $stdDevPop
. Różnica polega na tym, że $stdDevSamp
oblicza próbkę odchylenie standardowe, natomiast $stdDevPop
oblicza populację odchylenie standardowe.
Dlatego użyj $stdDevSamp
jeśli twoje wartości obejmują próbkę populacji danych, z której można uogólniać na temat populacji. Jeśli wartości reprezentują całą populację danych lub nie chcesz uogólniać na temat większej populacji, użyj $stdDevPop
zamiast tego.
Składnia
$stdDevSamp
operator obsługuje dwie składnie.
Składnia 1:
{ $stdDevSamp: <expression> }
Składnia 2:
{ $stdDevSamp: [ <expression1>, <expression2> ... ] }
Pierwsza składnia akceptuje jeden argument, a druga – wiele argumentów.
W przypadku użycia w grupie $group
etapie, możesz użyć tylko pierwszej składni. W tym przypadku $stdDevSamp
zwraca przykładowe odchylenie standardowe określonego wyrażenia dla grupy dokumentów, które dzielą tę samą grupę według klucza.
Przykłady składni 1 (pojedynczy argument)
Oto kilka przykładów używających składni 1.
Dokumenty zgrupowane
W tym przykładzie użyto $stdDevSamp
w połączeniu z $group
aby zwrócić odchylenie standardowe próbki w grupie dokumentów pogrupowanych według klucza.
Załóżmy, że mamy kolekcję o nazwie stonks
z następującymi dokumentami:
{ "_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 }
Możemy pogrupować te dokumenty według ich ticker
pole, a następnie użyj $stdDevSamp
aby zwrócić przykładowe odchylenie standardowe price
pole dla każdej grupy:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$price" }
}
}
]
)
Wynik:
{ "_id" : "gme", "result" : 131.24404748406687 } { "_id" : "jnj", "result" : 10.344080432788612 }
Widzimy, że gme
ma znacznie wyższe odchylenie standardowe próbki niż jnj
.
Tablice
Ten przykład dotyczy $stdDevSamp
do pojedynczego dokumentu, który zawiera pole z tablicą wartości.
Ta opcja jest dostępna tylko w przypadku używania składni jednoargumentowej. Tablice są ignorowane podczas używania składni wieloargumentowej (więcej na ten temat poniżej).
Załóżmy, że mamy kolekcję o nazwie players
z następującymi dokumentami:
{ "_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 }
Możemy zastosować $stdDevSamp
do scores
pole w każdym dokumencie:
db.players.aggregate(
[
{
$project:
{
result: { $stdDevSamp: "$scores" }
}
}
]
)
Wynik:
{ "_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 }
W tym przypadku pierwsze trzy dokumenty zwróciły odchylenie standardowe próbki dla różnych liczb, które znajdowały się w ich odpowiednich tablicach.
Dokument 4 spowodował odchylenie standardowe null
. Dzieje się tak, ponieważ w tablicy podaliśmy tylko jedną liczbę. Gdybyśmy użyli $stdDevPop
, zwróciłoby to 0
.
Dokument 5 zwrócił null
ponieważ dostarczyliśmy pustą tablicę.
Dokument 6 zwrócił null
ponieważ podaliśmy null
jako argument.
Przykład składni 2 (wiele argumentów)
Druga składnia obejmuje dostarczenie $stdDevSamp
z więcej niż jednym argumentem. $stdDevSamp
następnie oblicza odchylenie standardowe na podstawie wszystkich dostarczonych argumentów.
Załóżmy, że mamy kolekcję o nazwie data
z następującymi dokumentami:
{ "_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" }
Możemy użyć $stdDevSamp
aby zwrócić przykładowe odchylenie standardowe a
, b
, c
i d
pola każdego dokumentu:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Wynik:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
Wynik pierwszego dokumentu jest oparty na wartościach wejściowych 1
, 2
, 3
i 4
.
Jednak ostatnie dwa dokumenty dały tylko 1
, 2
i 3
oceniane. $stdDevSamp
operator zignorował ich d
pola.
$stdDevSamp
ignoruje wartości nieliczbowe. Więc w tym przypadku zignorował "Hey"
w dokumencie 3 i obliczył odchylenie standardowe próbki z pozostałych (liczbowych) pól.
Jeśli chodzi o dokument 2, jego d
pole zawiera tablicę. Jak wspomniano, $stdDevSamp
operator ignoruje tablice podczas używania składni wieloargumentowej. Dokładniej, w tym kontekście traktuje tablice jako wartości nieliczbowe. I jak wspomniano, $stdDevSamp
ignoruje wartości nieliczbowe.
Jeśli wszystkie wartości nie są liczbowe, to $stdDevSamp
zwraca null
.
Brakujące pola
Używając składni wieloargumentowej, $stdDevSamp
ignoruje brakujące pola. Oznacza to, że jeśli podasz pole, które nie istnieje, ignoruje je. Jeśli żadne z pól nie istnieje, zwraca null
.
Przykład:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Wynik:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
W tym przypadku dodałem dodatkowe pole ($e
), który nie istnieje w dokumencie. $stdDevSamp
obliczył odchylenie standardowe próbki na podstawie pozostałych pól, które wykonaj istnieje.
Oto jednak, co się dzieje, gdy brak z pól istnieje:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$x", "$y", "$z" ] }
}
}
]
)
Wynik:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
Wynik to null
dla wszystkich dokumentów.
Gdy używasz składni jednoargumentowej, brakujące pole daje wynik null
.
Przykład:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$oops!" }
}
}
]
)
Wynik:
{ "_id" : "gme", "result" : null } { "_id" : "jnj", "result" : null }
Dostępne etapy
$stdDevSamp
jest dostępny w następujących etapach:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
etap zawierający$expr
wyrażenie