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

MongoDB $avg Aggregations-Pipeline-Operator

In MongoDB ist der $avg Der Aggregations-Pipeline-Operator berechnet den Durchschnittswert der angegebenen numerischen Werte und gibt ihn zurück.

Syntax

Der $avg Operator unterstützt zwei Syntaxen.

Syntax 1:

{ $avg: <expression> } 

Syntax 2:

{ $avg: [ <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 $avg gibt den kollektiven Durchschnitt aller numerischen Werte zurück, die sich aus der Anwendung eines angegebenen Ausdrucks auf jedes Dokument in einer Gruppe von Dokumenten ergeben, die denselben Group-by-Key verwenden.

Beispiele für Syntax 1 (Einzelargument)

Hier sind ein paar Beispiele, die Syntax 1 verwenden.

Gruppierte Dokumente

Dieses Beispiel verwendet $avg in Verbindung mit $group um den Durchschnitt über eine Gruppe von Dokumenten zurückzugeben, die nach Schlüsseln gruppiert sind.

Angenommen, wir haben eine Sammlung namens pets mit folgenden Dokumenten:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }{ „_id“ :4, „Name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }{ „_id“ :5, „name“ :„Bruce“, „type“ :„Kangaroo“, „weight“ :100 }{ „ _id“ :6, „name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Kangaroo“, „Gewicht“ :200 }{ „_id“ :8, „Name“ :„Snap“, „Typ“ :„Katze“, „Gewicht“ :12 }{ „_id“ :9, „Name“ :„Ruff“, „Typ“ :„Hund“, „Gewicht“ :30 }

Wir können diese Dokumente nach ihrem type gruppieren Feld und verwenden Sie dann $avg um das durchschnittliche Gewicht jeder Gruppe zurückzugeben:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            average_weight: { $avg: "$weight" }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :"Hund", "durchschnittliches_gewicht" :20 }{ "_id" :"Katze", "durchschnittliches_gewicht" :9 }{ "_id" :"Känguru", "durchschnittliches_gewicht" :143.33333333333334 } 

Arrays

Dieses Beispiel wendet $avg 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 }{ „_id“ :7, „player“ :„Ron“ }

Wir können $avg anwenden zu den scores Feld in jedem Dokument:

db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            averageScore: { $avg: "$scores" }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.666666666666666 }{ "_id" :3, „player“ :„Bart“, „averageScore“ :6.333333333333333 }{ „_id“ :4, „player“ :„Brian“, „averageScore“ :7 }{ „_id“ :5, „player“ :„Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null } 

In diesem Fall haben die ersten vier Dokumente den Durchschnitt der verschiedenen Zahlen zurückgegeben, die sich in ihren jeweiligen Arrays befanden.

Im Fall von Dokument 4 war dies dasselbe wie die Zahl, da es nur eine Zahl im Array gab.

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.

Dokument 7 hat null zurückgegeben weil das Feld gar nicht existierte.

Beispiel für Syntax 2 (mehrere Argumente)

Die zweite Syntax beinhaltet die Bereitstellung von $avg mit mehr als einem Argument. $avg berechnet dann den Durchschnitt 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" } { "_id" :4, "a" :"Eins", "b" :"Zwei", "c" :"Drei", "d" :"Vier" }

Wir können $avg verwenden um den Durchschnitt von a zurückzugeben , b , c , und d Felder jedes Dokuments:

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

Ergebnis:

{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }

Dokument 1 gibt den Durchschnitt der Eingabewerte von 1 zurück , 2 , 3 , und 4 .

Die nächsten beiden Dokumente lieferten jedoch nur den Durchschnitt der Eingabewerte von 1 , 2 , und 3 . Der $avg Operator ignorierte ihr d Felder.

Das liegt daran, dass $avg ignoriert nicht numerische Werte. In diesem Fall wurde also "Hey" ignoriert in Dokument 3 und berechnete den Durchschnitt aus den verbleibenden (numerischen) Feldern.

Was Dokument 2 betrifft, ist es d Feld enthält ein Array. Wie bereits erwähnt, der $avg -Operator ignoriert Arrays, wenn die Syntax mit mehreren Argumenten verwendet wird. Genauer gesagt behandelt es Arrays als nicht numerische Werte, wenn es in diesem Zusammenhang verwendet wird, und $avg ignoriert nicht-numerische Werte.

Wenn alle Werte nicht numerisch sind, dann $avg gibt null zurück . Wir können dies anhand von Dokument 4 sehen.

Fehlende Felder

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

Ergebnis:

{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }

In diesem Fall habe ich ein zusätzliches Feld bereitgestellt ($e ), die in den Dokumenten nicht vorhanden ist. $avg Berechnet den Durchschnitt basierend auf den verbleibenden Feldern, die tun existieren.

Folgendes passiert jedoch, wenn keine der Felder existieren:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $avg: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Ergebnis:

{ „_id“ :1, „Ergebnis“ :null }{ „_id“ :2, „Ergebnis“ :null }{ „_id“ :3, „Ergebnis“ :null }{ „_id“ :4, „ result" :null }

Das Ergebnis ist null für alle Dokumente.

Wie wir bereits gesehen haben, führt ein fehlendes Feld bei Verwendung der Ein-Argument-Syntax zu null .

Beispiel:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            avg: { $avg: "$oops!" }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :"Känguru", "avg" :null }{ "_id" :"Katze", "avg" :null }{ "_id" :"Hund", "avg" :null } 

Verfügbare Stufen

$avg ist in den folgenden Stufen verfügbar:

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