In MongoDB der $stdDevPop
Der Aggregations-Pipeline-Operator berechnet die Populationsstandardabweichung seiner Eingabewerte.
Die Eingabewerte können aus einer Gruppe von Dokumenten stammen (d. h. Dokumenten, die nach demselben Schlüssel gruppiert sind), oder sie können mehrere Felder innerhalb eines einzelnen Dokuments sein.
Syntax
Der $stdDevPop
Operator unterstützt zwei Syntaxen.
Syntax 1:
{ $stdDevPop: <expression> }
Syntax 2:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
Die erste Syntax akzeptiert ein Argument und die zweite Syntax akzeptiert mehrere Argumente.
Bei Verwendung in $group
Phase können Sie nur die erste Syntax verwenden. In diesem Fall $stdDevPop
gibt die Grundgesamtheits-Standardabweichung des angegebenen Ausdrucks für eine Gruppe von Dokumenten zurück, die dieselbe Gruppe nach Schlüssel haben.
Beispiele für Syntax 1 (Einzelargument)
Hier sind ein paar Beispiele, die Syntax 1 verwenden.
Gruppierte Dokumente
Dieses Beispiel verwendet $stdDevPop
in Verbindung mit $group
um die Standardabweichung über eine Gruppe von Dokumenten zurückzugeben, die nach Schlüsseln gruppiert sind.
Angenommen, wir haben eine Sammlung namens stonks
mit folgenden Dokumenten:
{ "_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 }
Wir können diese Dokumente nach ihrem ticker
gruppieren Feld und verwenden Sie dann $stdDevPop
um die Populationsstandardabweichung des price
zurückzugeben Feld für jede Gruppe:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Ergebnis:
{ "_id" : "gme", "standardDeviation" : 123.7380746218039 } { "_id" : "jnj", "standardDeviation" : 9.752492558885207 }
Wir können dieses gme
sehen hat eine viel höhere Standardabweichung als jnj
.
Arrays
Dieses Beispiel wendet $stdDevPop
an zu einem einzelnen Dokument, das ein Feld mit einem Array von Werten enthält.
Diese Option ist nur verfügbar, wenn die Syntax mit einem einzigen Argument verwendet wird. Arrays werden ignoriert, wenn die Syntax mit mehreren Argumenten verwendet wird (mehr dazu weiter unten).
Angenommen, wir haben eine Sammlung namens players
mit folgenden Dokumenten:
{ "_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 }
Wir können $stdDevPop
anwenden zu den scores
Feld in jedem Dokument:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Ergebnis:
{ "_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 diesem Fall haben die ersten drei Dokumente die Standardabweichung für die verschiedenen Zahlen zurückgegeben, die sich in ihren jeweiligen Arrays befanden.
Dokument 4 ergab eine Standardabweichung von 0
. Das liegt daran, dass wir nur eine Zahl im Array angegeben haben.
Dokument 5 hat null
zurückgegeben weil wir ein leeres Array bereitgestellt haben.
Dokument 6 hat null
zurückgegeben weil wir null
bereitgestellt haben als Argument.
Beispiel für Syntax 2 (mehrere Argumente)
Die zweite Syntax beinhaltet die Bereitstellung von $stdDevPop
mit mehr als einem Argument. $stdDevPop
berechnet dann die Standardabweichung basierend auf allen angegebenen Argumenten.
Angenommen, wir haben eine Sammlung namens data
mit folgenden Dokumenten:
{ "_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" }
Wir können $stdDevPop
verwenden um die Populationsstandardabweichung von a
zurückzugeben , b
, c
, und d
Felder jedes Dokuments:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
Dokument 1 gibt die Standardabweichung basierend auf seinen Eingabewerten von 1
zurück , 2
, 3
, und 4
.
Die letzten beiden Dokumente haben jedoch nur die Standardabweichung für Eingabewerte von 1
zurückgegeben , 2
, und 3
. Der $stdDevPop
Operator ignorierte ihr d
Felder.
Warum ist das so?
Es funktioniert so, dass $stdDevPop
ignoriert nicht numerische Werte. In diesem Fall wurde also "Hey"
ignoriert in Dokument 3 und berechnete die Grundgesamtheits-Standardabweichung aus den verbleibenden (numerischen) Feldern.
Was Dokument 2 betrifft, ist es d
Feld enthält ein Array. Wie bereits erwähnt, der $stdDevPop
-Operator ignoriert Arrays, wenn die Syntax mit mehreren Argumenten verwendet wird. Genauer gesagt behandelt es Arrays als nicht numerische Werte, wenn es in diesem Kontext verwendet wird. Und wie erwähnt, $stdDevPop
ignoriert nicht-numerische Werte.
Wenn alle Werte nicht numerisch sind, dann $stdDevPop
gibt null
zurück .
Fehlende Felder
Bei Verwendung der Syntax mit mehreren Argumenten $stdDevPop
ignoriert alle fehlenden Felder. Das heißt, wenn Sie ein Feld angeben, das nicht vorhanden ist, wird es ignoriert. Wenn keines der Felder vorhanden ist, wird null
zurückgegeben .
Beispiel:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
In diesem Fall habe ich ein zusätzliches Feld bereitgestellt ($e
), die im Dokument nicht vorhanden ist. $stdDevPop
berechnete die Standardabweichung basierend auf den verbleibenden Feldern, die tun existieren.
Folgendes passiert jedoch, wenn keine der Felder existieren:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$x", "$y", "$z" ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
Das Ergebnis ist null
für alle Dokumente.
Bei Verwendung der Syntax mit einem Argument führt ein fehlendes Feld zu null
.
Beispiel:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$oops!" }
}
}
]
)
Ergebnis:
{ "_id" : "gme", "standardDeviation" : null } { "_id" : "jnj", "standardDeviation" : null }
Verfügbare Stufen
$stdDevPop
ist in den folgenden Stufen verfügbar:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
Stufe, die einen$expr
enthält Ausdruck
Berechnen Sie die Stichproben-Standardabweichung
Siehe MongoDB $stdDevSamp
wenn Sie die Probe benötigen Standardabweichung, im Gegensatz zur Population Standardabweichung. Dieser Operator ist nützlich, wenn Ihre Werte eine Stichprobe einer Grundgesamtheit von Daten umfassen, aus denen Sie die Grundgesamtheit verallgemeinern können.