I MongoDB er $stdDevSamp
aggregeringspipeline-operatør beregner prøvestandardafvigelsen for inputværdierne.
Indtastningsværdierne kan være fra en gruppe dokumenter (dvs. dokumenter, der er grupperet efter den samme nøgle), eller de kan være flere felter i et enkelt dokument.
$stdDevSamp
ligner $stdDevPop
. Forskellen er, at $stdDevSamp
beregner prøven standardafvigelse, hvorimod $stdDevPop
beregner befolkningen standardafvigelse.
Brug derfor $stdDevSamp
hvis dine værdier omfatter en stikprøve af en population af data, hvorfra man kan generalisere om populationen. Hvis værdierne repræsenterer hele populationen af data, eller du ikke ønsker at generalisere om en større population, skal du bruge $stdDevPop
i stedet.
Syntaks
$stdDevSamp
operatoren understøtter to syntakser.
Syntaks 1:
{ $stdDevSamp: <expression> }
Syntaks 2:
{ $stdDevSamp: [ <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 $stdDevSamp
returnerer prøvestandardafvigelsen 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 $stdDevSamp
i forbindelse med $group
for at returnere prøvestandardafvigelsen 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 $stdDevSamp
for at returnere prøvestandardafvigelsen for price
felt for hver gruppe:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$price" }
}
}
]
)
Resultat:
{ "_id" :"gme", "result" :131.24404748406687 }{ "_id" :"jnj", "result" :10.344080432788612 }
Vi kan se den gme
har en meget højere prøvestandardafvigelse end jnj
.
Arrays
Dette eksempel gælder $stdDevSamp
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 $stdDevSamp
til scores
felt i hvert dokument:
db.players.aggregate(
[
{
$project:
{
result: { $stdDevSamp: "$scores" }
}
}
]
)
Resultat:
{ "_id" :1, "result" :3.0783421635988546 }{ "_id" :2, "result" :7.633260552782583 }{ "_id" :3, "result" :8.5818}{7.5827 result" :null }{ "_id" :5, "result" :null }{ "_id" :6, "result" :null }
I dette tilfælde returnerede de første tre dokumenter prøvestandardafvigelsen for de forskellige tal, der var i deres respektive arrays.
Dokument 4 resulterede i en standardafvigelse på null
. Dette skyldes, at vi kun har angivet ét nummer i arrayet. Hvis vi havde brugt $stdDevPop
, ville dette have returneret 0
.
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 $stdDevSamp
med mere end ét argument. $stdDevSamp
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 $stdDevSamp
for at returnere prøvestandardafvigelsen for a
, b
, c
og d
felter i hvert dokument:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultat:
{ "_id" :1, "result" :1.2909944487358056 }{ "_id" :2, "result" :1 }{ "_id" :3, "result" :1 }
Det første dokuments resultat er baseret på inputværdierne for 1
, 2
, 3
og 4
.
De sidste to dokumenter resulterede dog kun i 1
, 2
og 3
bliver vurderet. $stdDevSamp
operatør ignorerede deres d
felter.
$stdDevSamp
ignorerer ikke-numeriske værdier. Så i dette tilfælde ignorerede den "Hey"
i dokument 3 og beregnede prøvens standardafvigelse fra de resterende (numeriske) felter.
Hvad angår dokument 2, er dets d
felt indeholder en matrix. Som nævnt er $stdDevSamp
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, $stdDevSamp
ignorerer ikke-numeriske værdier.
Hvis alle værdier er ikke-numeriske, så $stdDevSamp
returnerer null
.
Manglende felter
Når du bruger multi-argument-syntaksen, $stdDevSamp
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 det null
.
Eksempel:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Resultat:
{ "_id" :1, "result" :1.2909944487358056 }{ "_id" :2, "result" :1 }{ "_id" :3, "result" :1 }
I dette tilfælde har jeg angivet et ekstra felt ($e
), der ikke findes i dokumentet. $stdDevSamp
beregnede prøvens standardafvigelse 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: { $stdDevSamp: [ "$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",
result: { $stdDevSamp: "$oops!" }
}
}
]
)
Resultat:
{ "_id" :"gme", "result" :null }{ "_id" :"jnj", "result" :null }
Tilgængelige stadier
$stdDevSamp
er tilgængelig i følgende trin:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
trin, der inkluderer en$expr
udtryk