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

MongoDB $max Aggregations-Pipeline-Operator

In MongoDB der $max Der Aggregations-Pipeline-Operator gibt den Maximalwert eines Ausdrucks zurück.

Syntax

Der $max Operator unterstützt zwei Syntaxen.

Syntax 1:

{ $max: <expression> } 

Syntax 2:

{ $max: [ <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 $max gibt den maximalen Wert zurück, der sich aus der Anwendung eines Ausdrucks auf jedes Dokument in einer Gruppe von Dokumenten ergibt, die denselben Group-by-Schlüssel verwenden.

Beispiele für Syntax 1 (Einzelargument)

Hier sind ein paar Beispiele, die die Syntax mit einem einzigen Argument verwenden.

Gruppierte Dokumente

Dieses Beispiel verwendet $max in Verbindung mit $group um den maximalen Wert aus einer 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 $max um den Maximalwert des weight zurückzugeben Feld für jede Gruppe:

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

Ergebnis:

{ "_id" :"Känguru", "max" :200 }{ "_id" :"Katze", "max" :12 }{ "_id" :"Hund", "max" :30 } 

Arrays

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

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

Ergebnis:

{ "_id" :1, "player" :"Homer", "max" :8 }{ "_id" :2, "player" :"Marge", "max" :18 }{ "_id" :3, „player“ :„Bart“, „max“ :15 }{ „_id“ :4, „player“ :„Brian“, „max“ :7 }{ „_id“ :5, „player“ :„Farnsworth ", "max" :null }{ "_id" :6, "player" :"Meg", "max" :null }{ "_id" :7, "player" :"Ron", "max" :null } 

In diesem Fall haben die ersten vier Dokumente den Maximalwert aus den 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 angegeben 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 $max mit mehr als einem Argument. $max gibt dann den maximalen Wert aus allen angegebenen Argumenten zurück.

Angenommen, wir haben eine Sammlung namens data mit folgendem Dokument:

{ "_id" :1, "a" :10, "b" :500, "c" :-900, "d" :4 }

Wir können $max verwenden um den Maximalwert von a zurückzugeben , b , c , und d Felder:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :1, "max" :500 }

In diesem Fall 500 war der Maximalwert.

Fehlende Felder

Bei Verwendung der Syntax mit mehreren Argumenten $max 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(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :1, "max" :500 }

In diesem Fall habe ich ein zusätzliches Feld bereitgestellt ($e ), die im Dokument nicht vorhanden ist. $max Berechnet den Maximalwert basierend auf den verbleibenden Feldern, die tun existieren.

Folgendes passiert jedoch, wenn keine der Felder existieren:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            result: { $max: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :1, "Ergebnis" :null }

Das Ergebnis ist null .

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",
            max: { $max: "$oops!" }
          }
     }
   ]
) 

Ergebnis:

{ „_id“ :„Hund“, „max“ :null }{ „_id“ :„Känguru“, „max“ :null }{ „_id“ :„Katze“, „max“ :null } 

Vergleich verschiedener Typen

Der $max -Operator vergleicht sowohl den Wert als auch den Typ. Wenn die Werte unterschiedlichen Typs sind, $max berechnet den Maximalwert basierend auf der BSON-Vergleichsreihenfolge.

Angenommen, unsere Sammlung enthält die folgenden Dokumente:

{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 1 ] }{ "_id" :3, "a" :1, " b“ :2, „c“ :3, „d“ :„1“ }{ „_id“ :4, „a“ :„Eins“, „b“ :„Zwei“, „c“ :„Drei“, "d" :"Four" }{ "_id" :5, "a" :ISODate("1999-01-03T23:30:15.100Z"), "b" :ISODate("2000-01-03T23:30:15.100Z")}{ "_id" :6, "a" :ISODate("1999-01-03T23:30:15.100Z"), "b" :"2000-01-03T23:30:15.100Z"}

Mit Ausnahme von Dokument 4 verwendet jedes dieser Dokumente gemischte Typen (es gibt mindestens einen Typ, der sich von den anderen Datenfeldern unterscheidet). Dokument 4 verwendet Strings in allen vier Feldern.

Folgendes passiert, wenn wir $max anwenden zu diesen Dokumenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Ergebnis:

{ "_id" :2, "max" :[ 1 ] }{ "_id" :3, "max" :"1" }{ "_id" :4, "max" :"Zwei" }{ " _id" :5, "max" :ISODate("2000-01-03T23:30:15.100Z") }{ "_id" :6, "max" :ISODate("1999-01-03T23:30:15.100Z" ) }

das Dokument mit einer _id von 2 , sind Arrays größer als Zahlen, also wird das Array zurückgegeben (obwohl sein Element eine Zahl ist, die kleiner als einige der anderen Zahlen ist).

Dokument 3:Zeichenfolgen sind größer als Zahlen, daher wird die Zeichenfolge zurückgegeben.

Dokument 4:Alle Felder sind Strings, also Two ist die größte Saite.

Dokument 5:Es werden zwei Daten bereitgestellt, daher wird das spätere Datum zurückgegeben.

Dokument 6:In diesem Fall werden ein Datumsobjekt und ein Datumsstring bereitgestellt. Date-Objekte sind größer als Strings, und daher wird das Date-Objekt zurückgegeben (obwohl sein Datum vor dem des Strings liegt).

Verfügbare Stufen

$max ist in den folgenden Stufen verfügbar:

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