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 denscores
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 wirnull
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 vona
zurückzugeben ,b
,c
, undd
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, wirdnull
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
von2
, 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