MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $stdDevSamp

In MongoDB ist das $stdDevSamp Der Aggregations-Pipeline-Operator berechnet die Stichproben-Standardabweichung der 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.

$stdDevSamp ähnelt $stdDevPop . Der Unterschied besteht darin, dass $stdDevSamp berechnet die Stichprobe Standardabweichung, wohingegen $stdDevPop berechnet die Bevölkerung Standardabweichung.

Verwenden Sie daher $stdDevSamp wenn Ihre Werte eine Stichprobe einer Grundgesamtheit von Daten umfassen, aus denen Verallgemeinerungen über die Grundgesamtheit vorgenommen werden können. Wenn die Werte die gesamte Datenpopulation darstellen oder Sie nicht über eine größere Population verallgemeinern möchten, verwenden Sie $stdDevPop stattdessen.

Syntax

Der $stdDevSamp Operator unterstützt zwei Syntaxen.

Syntax 1:

{ $stdDevSamp: <expression> }

Syntax 2:

{ $stdDevSamp: [ <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 $stdDevSamp gibt die Stichproben-Standardabweichung des angegebenen Ausdrucks für eine Gruppe von Dokumenten zurück, die denselben Group-by-Key teilen.

Beispiele für Syntax 1 (Einzelargument)

Hier sind ein paar Beispiele, die Syntax 1 verwenden.

Gruppierte Dokumente

Dieses Beispiel verwendet $stdDevSamp in Verbindung mit $group um die Stichproben-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 $stdDevSamp um die Stichproben-Standardabweichung des price zurückzugeben Feld für jede Gruppe:

db.stonks.aggregate(
   [
     {
       $group:
          {
            _id: "$ticker",
            result: { $stdDevSamp: "$price" }
          }
     }
   ]
)

Ergebnis:

{ "_id" : "gme", "result" : 131.24404748406687 }
{ "_id" : "jnj", "result" : 10.344080432788612 }

Wir können dieses gme sehen hat eine viel höhere Stichproben-Standardabweichung als jnj .

Arrays

Dieses Beispiel wendet $stdDevSamp 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 $stdDevSamp anwenden zu den scores Feld in jedem Dokument:

db.players.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevSamp: "$scores" }
          }
     }
   ]
)

Ergebnis:

{ "_id" : 1, "result" : 3.0783421635988546 }
{ "_id" : 2, "result" : 7.633260552782583 }
{ "_id" : 3, "result" : 5.988878581726855 }
{ "_id" : 4, "result" : null }
{ "_id" : 5, "result" : null }
{ "_id" : 6, "result" : null }

In diesem Fall haben die ersten drei Dokumente die Stichproben-Standardabweichung für die verschiedenen Zahlen zurückgegeben, die sich in ihren jeweiligen Arrays befanden.

Dokument 4 ergab eine Standardabweichung von null . Dies liegt daran, dass wir nur eine Zahl im Array angegeben haben. Wenn wir $stdDevPop verwendet hätten , hätte dies 0 zurückgegeben .

Dokument 5 hat null zurückgegeben weil wir ein leeres Array bereitgestellt haben.

Dokument 6 hat null zurückgegeben weil wir null angegeben haben als Argument.

Beispiel für Syntax 2 (mehrere Argumente)

Die zweite Syntax beinhaltet die Bereitstellung von $stdDevSamp mit mehr als einem Argument. $stdDevSamp 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 $stdDevSamp verwenden um die Stichproben-Standardabweichung von a zurückzugeben , b , c , und d Felder jedes Dokuments:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
)

Ergebnis:

{ "_id" : 1, "result" : 1.2909944487358056 }
{ "_id" : 2, "result" : 1 }
{ "_id" : 3, "result" : 1 }

Das Ergebnis des ersten Dokuments basiert auf den Eingabewerten von 1 , 2 , 3 , und 4 .

Die letzten beiden Dokumente ergaben jedoch nur 1 , 2 , und 3 ausgewertet wird. Der $stdDevSamp Operator ignorierte ihr d Felder.

Der $stdDevSamp ignoriert nicht numerische Werte. In diesem Fall wurde also "Hey" ignoriert in Dokument 3 und berechnete die Standardabweichung der Stichprobe aus den verbleibenden (numerischen) Feldern.

Was Dokument 2 betrifft, ist es d Feld enthält ein Array. Wie bereits erwähnt, die $stdDevSamp -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, $stdDevSamp ignoriert nicht-numerische Werte.

Wenn alle Werte nicht numerisch sind, dann $stdDevSamp gibt null zurück .

Fehlende Felder

Bei Verwendung der Syntax mit mehreren Argumenten $stdDevSamp 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: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
)

Ergebnis:

{ "_id" : 1, "result" : 1.2909944487358056 }
{ "_id" : 2, "result" : 1 }
{ "_id" : 3, "result" : 1 }

In diesem Fall habe ich ein zusätzliches Feld bereitgestellt ($e ), die im Dokument nicht vorhanden ist. $stdDevSamp berechnete die Standardabweichung der Stichprobe basierend auf den verbleibenden Feldern, die tun existieren.

Folgendes passiert jedoch, wenn keine der Felder existieren:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevSamp: [ "$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",
            result: { $stdDevSamp: "$oops!" }
          }
     }
   ]
)

Ergebnis:

{ "_id" : "gme", "result" : null }
{ "_id" : "jnj", "result" : null }

Verfügbare Stufen

$stdDevSamp ist in den folgenden Stufen verfügbar:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match Stufe, die einen $expr enthält Ausdruck