In MongoDB, de $stdDevPop
aggregatiepijplijnoperator berekent de populatiestandaarddeviatie van zijn invoerwaarden.
De invoerwaarden kunnen afkomstig zijn uit een groep documenten (d.w.z. documenten die op dezelfde sleutel zijn gegroepeerd), of het kunnen meerdere velden zijn binnen een enkel document.
Syntaxis
De $stdDevPop
operator ondersteunt twee syntaxis.
Syntaxis 1:
{ $stdDevPop: <expression> }
Syntaxis 2:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
De eerste syntaxis accepteert één argument en de tweede syntaxis accepteert meerdere argumenten.
Bij gebruik in de $group
stadium, kunt u alleen de eerste syntaxis gebruiken. In dit geval $stdDevPop
geeft de populatiestandaarddeviatie van de opgegeven uitdrukking voor een groep documenten die dezelfde groep op sleutel delen.
Voorbeelden van syntaxis 1 (enkel argument)
Hier zijn een paar voorbeelden die syntaxis 1 gebruiken.
Gegroepeerde documenten
Dit voorbeeld gebruikt $stdDevPop
in combinatie met $group
om de standaarddeviatie te retourneren voor een groep documenten die op sleutel zijn gegroepeerd.
Stel dat we een verzameling hebben met de naam stonks
met de volgende documenten:
{ "_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 }
We kunnen deze documenten groeperen op hun ticker
veld, en gebruik dan $stdDevPop
om de populatiestandaarddeviatie van de price
te retourneren veld voor elke groep:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Resultaat:
{ "_id" : "gme", "standardDeviation" : 123.7380746218039 } { "_id" : "jnj", "standardDeviation" : 9.752492558885207 }
We kunnen zien dat gme
heeft een veel hogere standaarddeviatie dan jnj
.
Arrays
Dit voorbeeld is van toepassing op $stdDevPop
naar een enkel document dat een veld met een reeks waarden bevat.
Deze optie is alleen beschikbaar bij gebruik van de syntaxis voor één argument. Arrays worden genegeerd bij gebruik van de syntaxis met meerdere argumenten (meer hierover hieronder).
Stel dat we een verzameling hebben met de naam players
met de volgende documenten:
{ "_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 }
We kunnen $stdDevPop
. toepassen naar de scores
veld in elk document:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Resultaat:
{ "_id" : 1, "standardDeviation" : 2.849991049037143 } { "_id" : 2, "standardDeviation" : 6.968181653455625 } { "_id" : 3, "standardDeviation" : 5.467073155618908 } { "_id" : 4, "standardDeviation" : 0 } { "_id" : 5, "standardDeviation" : null } { "_id" : 6, "standardDeviation" : null }
In dit geval gaven de eerste drie documenten de standaarddeviatie terug voor de verschillende getallen die in hun respectievelijke arrays stonden.
Document 4 resulteerde in een standaarddeviatie van 0
. Dit komt omdat we maar één nummer in de array hebben opgegeven.
Document 5 retourneerde null
omdat we een lege array hebben opgegeven.
Document 6 retourneerde null
omdat we null
. hebben opgegeven als het argument.
Voorbeeld van syntaxis 2 (meerdere argumenten)
De tweede syntaxis omvat het verstrekken van $stdDevPop
met meer dan één argument. $stdDevPop
berekent vervolgens de standaarddeviatie op basis van alle geleverde argumenten.
Stel dat we een verzameling hebben met de naam data
met de volgende documenten:
{ "_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" }
We kunnen $stdDevPop
. gebruiken om de populatiestandaarddeviatie van de a
. te retourneren , b
, c
, en d
velden van elk document:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
Document 1 retourneert de standaarddeviatie op basis van de invoerwaarden van 1
, 2
, 3
, en 4
.
De laatste twee documenten hebben echter alleen de standaarddeviatie geretourneerd voor invoerwaarden van 1
, 2
, en 3
. De $stdDevPop
operator negeerde hun d
velden.
Waarom is dit?
De manier waarop het werkt is dat $stdDevPop
negeert niet-numerieke waarden. Dus in dit geval negeerde het "Hey"
in document 3 en berekende de populatiestandaarddeviatie van de overige (numerieke) velden.
Wat betreft document 2, het is d
veld bevat een array. Zoals gezegd, de $stdDevPop
operator negeert arrays bij gebruik van de syntaxis met meerdere argumenten. Meer precies, het behandelt arrays als niet-numerieke waarden wanneer ze in deze context worden gebruikt. En zoals gezegd, $stdDevPop
negeert niet-numerieke waarden.
Als alle waarden niet-numeriek zijn, dan $stdDevPop
retourneert null
.
Ontbrekende velden
Bij gebruik van de syntaxis met meerdere argumenten, $stdDevPop
negeert eventuele ontbrekende velden. Dat wil zeggen, als u een veld opgeeft dat niet bestaat, wordt dit genegeerd. Als geen van de velden bestaat, retourneert het null
.
Voorbeeld:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
In dit geval heb ik een extra veld ($e
) die niet in het document voorkomt. $stdDevPop
berekende de standaarddeviatie op basis van de resterende velden die doen bestaan.
Dit is echter wat er gebeurt als geen van de velden bestaat:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$x", "$y", "$z" ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
Het resultaat is null
voor alle documenten.
Bij gebruik van de syntaxis met één argument resulteert een ontbrekend veld in null
.
Voorbeeld:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$oops!" }
}
}
]
)
Resultaat:
{ "_id" : "gme", "standardDeviation" : null } { "_id" : "jnj", "standardDeviation" : null }
Beschikbare stadia
$stdDevPop
is beschikbaar in de volgende fasen:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
fase met een$expr
uitdrukking
Bereken de standaarddeviatie van het monster
Zie MongoDB $stdDevSamp
als u het voorbeeld nodig heeft standaarddeviatie, in tegenstelling tot de populatie standaardafwijking. Deze operator is handig als uw waarden een steekproef van een populatie van gegevens omvatten waaruit u kunt generaliseren over de populatie.