I MongoDB er $stdDevPop
aggregeringspipeline-operatør beregner populationens standardafvigelse for dens inputværdier.
Indtastningsværdierne kan være fra en gruppe dokumenter (dvs. dokumenter, der er grupperet efter samme nøgle), eller de kan være flere felter i et enkelt dokument.
Syntaks
$stdDevPop
operatoren understøtter to syntakser.
Syntaks 1:
{ $stdDevPop: <expression> }
Syntaks 2:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
Den første syntaks accepterer ét argument, og den anden syntaks accepterer flere argumenter.
Når det bruges i $group
fase, kan du kun bruge den første syntaks. I dette tilfælde $stdDevPop
returnerer populationens standardafvigelse for det angivne udtryk for en gruppe dokumenter, der deler den samme gruppe efter nøgle.
Eksempler på syntaks 1 (enkelt argument)
Her er et par eksempler, der bruger syntaks 1.
Grupperte dokumenter
Dette eksempel bruger $stdDevPop
i forbindelse med $group
for at returnere standardafvigelsen på tværs af en gruppe dokumenter, der er grupperet efter nøgle.
Antag, at vi har en samling kaldet stonks
med følgende dokumenter:
{ "_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 gruppere disse dokumenter efter deres ticker
felt, og brug derefter $stdDevPop
for at returnere populationens standardafvigelse for price
felt for hver gruppe:
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 meget højere standardafvigelse end jnj
.
Arrays
Dette eksempel gælder $stdDevPop
til et enkelt dokument, der indeholder et felt med en række værdier.
Denne indstilling er kun tilgængelig, når du bruger syntaksen for enkelt argument. Arrays ignoreres, når du bruger multi-argument-syntaksen (mere om dette nedenfor).
Antag, at vi har en samling kaldet players
med følgende dokumenter:
{ "_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 anvende $stdDevPop
til scores
felt i hvert dokument:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Resultat:
{ "_id" :1, "standardafvigelse" :2.849991049037143 }{ "_id" :2, "standardafvigelse" :6.968181653455625 }{ "_id" :3, "standardafvigelse" 5, 73. 5, 73 :8 :8 :8, 6, 13 standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }
I dette tilfælde returnerede de første tre dokumenter standardafvigelsen for de forskellige tal, der var i deres respektive arrays.
Dokument 4 resulterede i en standardafvigelse på 0
. Dette skyldes, at vi kun har angivet ét nummer i arrayet.
Dokument 5 returnerede null
fordi vi leverede et tomt array.
Dokument 6 returnerede null
fordi vi har leveret null
som argumentet.
Eksempel på syntaks 2 (flere argumenter)
Den anden syntaks involverer at give $stdDevPop
med mere end ét argument. $stdDevPop
beregner derefter standardafvigelsen baseret på alle de leverede argumenter.
Antag, at vi har en samling kaldet data
med følgende dokumenter:
{ "_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 bruge $stdDevPop
for at returnere populationens standardafvigelse for a
, b
, c
og d
felter i hvert 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,5816497}>Dokument 1 returnerer standardafvigelsen baseret på dets inputværdier
1
,2
,3
og4
.De sidste to dokumenter returnerede dog kun standardafvigelsen for inputværdier på
1
,2
og3
.$stdDevPop
operatør ignorerede deresd
felter.Hvorfor er dette?
Måden det fungerer på er at
$stdDevPop
ignorerer ikke-numeriske værdier. Så i dette tilfælde ignorerede den"Hey"
i dokument 3 og beregnede populationens standardafvigelse fra de resterende (numeriske) felter.Hvad angår dokument 2, er dets
d
felt indeholder en matrix. Som nævnt er$stdDevPop
operatør ignorerer arrays, når der bruges multi-argument syntaks. Mere præcist behandler den arrays som ikke-numeriske værdier, når de bruges i denne sammenhæng. Og som nævnt,$stdDevPop
ignorerer ikke-numeriske værdier.Hvis alle værdier er ikke-numeriske, så
$stdDevPop
returnerernull
.Manglende felter
Når du bruger multi-argument-syntaksen,
$stdDevPop
ignorerer eventuelle manglende felter. Det vil sige, at hvis du angiver et felt, der ikke eksisterer, ignorerer det det. Hvis ingen af felterne eksisterer, returnerer detnull
.Eksempel:
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,5816497}>I dette tilfælde har jeg angivet et ekstra felt (
$e
), der ikke findes i dokumentet.$stdDevPop
beregnet standardafvigelsen baseret på de resterende felter, der gør eksisterer.Men her er, hvad der sker, når ingen af felterne findes:
db.data.aggregate( [ { $project: { result: { $stdDevPop: [ "$x", "$y", "$z" ] } } } ] )
Resultat:
{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }Resultatet er
null
for alle dokumenter.Når du bruger enkelt-argument-syntaksen, resulterer et manglende felt i
null
.Eksempel:
db.stonks.aggregate( [ { $group: { _id: "$ticker", standardDeviation: { $stdDevPop: "$oops!" } } } ] )
Resultat:
{ "_id" :"gme", "standardDeviation" :null }{ "_id" :"jnj", "standardDeviation" :null }Tilgængelige stadier
$stdDevPop
er tilgængelig i følgende trin:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
trin, der inkluderer en$expr
udtryk
Beregn prøvens standardafvigelse
Se MongoDB $stdDevSamp
hvis du har brug for at få eksemplet standardafvigelse i modsætning til befolkningen standardafvigelse. Denne operator er nyttig, hvis dine værdier omfatter en stikprøve af en population af data, hvorfra der kan generaliseres om populationen.