I MongoDB, $stdDevPop
aggregeringspipeline-operatören beräknar populationens standardavvikelse för dess ingångsvärden.
Inmatningsvärdena kan komma från en grupp av dokument (dvs. dokument som är grupperade efter samma nyckel), eller så kan de vara flera fält inom ett enda dokument.
Syntax
$stdDevPop
operatorn stöder två syntaxer.
Syntax 1:
{ $stdDevPop: <expression> }
Syntax 2:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
Den första syntaxen accepterar ett argument och den andra syntaxen accepterar flera argument.
När den används i $group
steg kan du bara använda den första syntaxen. I det här fallet, $stdDevPop
returnerar populationens standardavvikelse för det angivna uttrycket för en grupp dokument som delar samma grupp med nyckel.
Exempel på syntax 1 (enkelt argument)
Här är ett par exempel som använder syntax 1.
Grupperade dokument
Det här exemplet använder $stdDevPop
i samband med $group
för att returnera standardavvikelsen över en grupp av dokument som är grupperade efter nyckel.
Anta att vi har en samling som heter stonks
med följande dokument:
{ "_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 }
Vi kan gruppera dessa dokument efter deras ticker
och använd sedan $stdDevPop
för att returnera populationens standardavvikelse för price
fält för varje grupp:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Resultat:
{ "_id" :"gme", "standardDeviation" :123.7380746218039 }{ "_id" :"jnj", "standardDeviation" :9.752492558885207 }
Vi kan se den gme
har en mycket högre standardavvikelse än jnj
.
Arrayer
Det här exemplet gäller $stdDevPop
till ett enda dokument som innehåller ett fält med en rad värden.
Det här alternativet är endast tillgängligt när du använder syntaxen för enstaka argument. Matriser ignoreras när man använder flerargumentsyntaxen (mer om detta nedan).
Anta att vi har en samling som heter players
med följande dokument:
{ "_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 }
Vi kan använda $stdDevPop
till scores
fält i varje dokument:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Resultat:
{ "_id" :1, "standardavvikelse" :2.849991049037143 }{ "_id" :2, "standardavvikelse" :6.968181653455625 }{ "_id" :3, "standardavvikelse" 5, 73 :8 :0 5, 6, 8, 5, 6, 6, 8, 6. standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }
I det här fallet returnerade de tre första dokumenten standardavvikelsen för de olika siffrorna som fanns i deras respektive matriser.
Dokument 4 resulterade i en standardavvikelse på 0
. Detta beror på att vi bara angav ett nummer i arrayen.
Dokument 5 returnerade null
eftersom vi tillhandahållit en tom array.
Dokument 6 returnerade null
eftersom vi tillhandahållit null
som argument.
Exempel på syntax 2 (flera argument)
Den andra syntaxen innebär att tillhandahålla $stdDevPop
med mer än ett argument. $stdDevPop
beräknar sedan standardavvikelsen baserat på alla angivna argument.
Anta att vi har en samling som heter data
med följande dokument:
{ "_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" :"Hej" }
Vi kan använda $stdDevPop
för att returnera populationens standardavvikelse för a
, b
, c
och d
fält för varje dokument:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultat:
{ "_id" :1, "result" :1.118033988749895 }{ "_id" :2, "result" :0.816496580927726 }{ "_id" :3, "result" :0,5816949Dokument 1 returnerar standardavvikelsen baserat på dess ingångsvärden
1
,2
,3
och4
.De två sista dokumenten returnerade dock bara standardavvikelsen för indatavärden
1
,2
och3
.$stdDevPop
operatören ignorerade derasd
fält.Varför är detta?
Så det fungerar är att
$stdDevPop
ignorerar icke-numeriska värden. Så i det här fallet ignorerade den"Hey"
i dokument 3 och beräknade populationens standardavvikelse från de återstående (numeriska) fälten.När det gäller dokument 2, dess
d
fältet innehåller en array. Som nämnts,$stdDevPop
operatorn ignorerar matriser när syntaxen för flera argument används. Mer exakt behandlar den arrayer som icke-numeriska värden när de används i detta sammanhang. Och som nämnts,$stdDevPop
ignorerar icke-numeriska värden.Om alla värden är icke-numeriska, då
$stdDevPop
returnerarnull
.Fält saknas
När du använder syntaxen för flera argument,
$stdDevPop
ignorerar eventuella saknade fält. Det vill säga, om du anger ett fält som inte finns ignorerar det det. Om inget av fälten finns returnerar detnull
.Exempel:
db.data.aggregate( [ { $project: { result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Resultat:
{ "_id" :1, "result" :1.118033988749895 }{ "_id" :2, "result" :0.816496580927726 }{ "_id" :3, "result" :0,5816949I det här fallet angav jag ett extra fält (
$e
) som inte finns i dokumentet.$stdDevPop
beräknade standardavvikelsen baserat på de återstående fälten som gör finns.Men här är vad som händer när ingen av fälten finns:
db.data.aggregate( [ { $project: { result: { $stdDevPop: [ "$x", "$y", "$z" ] } } } ] )
Resultat:
{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }Resultatet är
null
för alla dokument.När du använder syntaxen med ett argument resulterar ett saknat fält i
null
.Exempel:
db.stonks.aggregate( [ { $group: { _id: "$ticker", standardDeviation: { $stdDevPop: "$oops!" } } } ] )
Resultat:
{ "_id" :"gme", "standardDeviation" :null }{ "_id" :"jnj", "standardDeviation" :null }Tillgängliga steg
$stdDevPop
är tillgänglig i följande steg:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
steg som inkluderar en$expr
uttryck
Beräkna provets standardavvikelse
Se MongoDB $stdDevSamp
om du behöver få provet standardavvikelse, i motsats till populationen standardavvikelse. Den här operatorn är användbar om dina värden omfattar ett urval av en population av data för att generalisera om populationen.