Dans MongoDB, le $max
l'opérateur de pipeline d'agrégation renvoie la valeur maximale d'une expression.
Syntaxe
Le $max
L'opérateur prend en charge deux syntaxes.
Syntaxe 1 :
{ $max: <expression> }
Syntaxe 2 :
{ $max: [ <expression1>, <expression2> ... ] }
La première syntaxe accepte un argument et la deuxième syntaxe accepte plusieurs arguments.
Lorsqu'il est utilisé dans le $group
étape, vous ne pouvez utiliser que la première syntaxe. Dans ce cas, $max
renvoie la valeur maximale résultant de l'application d'une expression à chaque document d'un groupe de documents partageant le même groupe par clé.
Exemples de syntaxe 1 (argument unique)
Voici quelques exemples qui utilisent la syntaxe à argument unique.
Documents groupés
Cet exemple utilise $max
en conjonction avec $group
pour renvoyer la valeur maximale d'un groupe de documents regroupés par clé.
Supposons que nous ayons une collection appelée pets
avec les documents suivants :
{ "_id" :1, "name" :"Wag", "type" :"Chien", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Chien", "poids" :10 }{ "_id" :3, "nom" :"Miaou", "type" :"Chat", "poids" :7 }{ "_id" :4, "nom" :"Scratch", "type" :"Chat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Kangaroo", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Kangaroo", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Chien", "poids" :30 }
Nous pouvons regrouper ces documents par leur type
champ, puis utilisez $max
pour retourner la valeur maximale du weight
champ pour chaque groupe :
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
max: { $max: "$weight" }
}
}
]
)
Résultat :
{ "_id" :"Kangourou", "max" :200 }{ "_id" :"Chat", "max" :12 }{ "_id" :"Chien", "max" :30 }Tableaux
Cet exemple applique
$max
à un seul document qui contient un champ avec un tableau de valeurs.Cette option n'est disponible que lors de l'utilisation de la syntaxe à argument unique. Les tableaux sont ignorés lors de l'utilisation de la syntaxe multi-arguments (plus d'informations ci-dessous).
Supposons que nous ayons une collection appelée
players
avec les documents suivants :{ "_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" }Nous pouvons appliquer
$max
auxscores
champ dans chaque document :db.players.aggregate( [ { $project: { player: 1, max: { $max: "$scores" } } } ] )
Résultat :
{ "_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 }Dans ce cas, les quatre premiers documents ont renvoyé la valeur maximale des différents nombres qui se trouvaient dans leurs tableaux respectifs.
Dans le cas du document 4, c'était le même que le nombre, car il n'y avait qu'un seul nombre dans le tableau.
Le document 5 a renvoyé
null
car nous avons fourni un tableau vide.Le document 6 a renvoyé
null
car nous avons fourninull
comme argument.Le document 7 a renvoyé
null
car le champ n'existait même pas.Exemple de syntaxe 2 (arguments multiples)
La deuxième syntaxe consiste à fournir
$max
avec plus d'un argument.$max
renvoie ensuite la valeur maximale de tous les arguments fournis.Supposons que nous ayons une collection appelée
data
avec le document suivant :{ "_id" :1, "a" :10, "b" :500, "c" :-900, "d" :4 }Nous pouvons utiliser
$max
pour renvoyer la valeur maximale dua
,b
,c
, etd
champs :db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d" ] } } } ] )
Résultat :
{ "_id" :1, "max" :500 }Dans ce cas,
500
était la valeur maximale.Champs manquants
Lors de l'utilisation de la syntaxe multi-arguments,
$max
ignore les champs manquants. Autrement dit, si vous fournissez un champ qui n'existe pas, il l'ignore. Si aucun des champs n'existe, alors il renvoienull
.Exemple :
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Résultat :
{ "_id" :1, "max" :500 }Dans ce cas, j'ai fourni un champ supplémentaire (
$e
) qui n'existe pas dans le document.$max
calculé la valeur maximale en fonction des champs restants qui font existent.Cependant, voici ce qui se passe lorsque aucun des champs existent :
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { result: { $max: [ "$x", "$y", "$z" ] } } } ] )
Résultat :
{ "_id" :1, "result" :null }Le résultat est
null
.Comme nous l'avons vu précédemment, lors de l'utilisation de la syntaxe à argument unique, un champ manquant entraîne
null
.Exemple :
db.pets.aggregate( [ { $group: { _id: "$type", max: { $max: "$oops!" } } } ] )
Résultat :
{ "_id" :"Chien", "max" :null }{ "_id" :"Kangourou", "max" :null }{ "_id" :"Chat", "max" :null }Comparer différents types
Le
$max
L'opérateur compare à la fois la valeur et le type. Lorsque les valeurs sont de types différents,$max
calcule la valeur maximale en fonction de l'ordre de comparaison BSON.Supposons que notre collection contienne les documents suivants :
{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 1 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"1" }{ "_id" :4, "a" :"Un", "b" :"Deux", "c" :"Trois", "d" :"Quatre" }{ "_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"}À l'exception du document 4, chacun de ces documents utilise des types mixtes (il existe au moins un type différent des autres dans les champs de données). Le document 4 utilise des chaînes dans les quatre champs.
Voici ce qui se passe lorsque nous appliquons
$max
à ces documents :db.data.aggregate( [ { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } }, { $project: { max: { $max: [ "$a", "$b", "$c", "$d" ] } } } ] )
Résultat :
{ "_id" :2, "max" :[ 1 ] }{ "_id" :3, "max" :"1" }{ "_id" :4, "max" :"Deux" }{ " _id" :5, "max" :ISODate("2000-01-03T23:30:15.100Z") }{ "_id" :6, "max" :ISODate("1999-01-03T23:30:15.100Z" ) }le document avec un
_id
de2
, les tableaux sont supérieurs aux nombres, donc le tableau est renvoyé (même si son élément est un nombre inférieur à certains des autres nombres).Document 3 :les chaînes sont supérieures aux nombres, et la chaîne est donc renvoyée.
Document 4 :Tous les champs sont des chaînes, et donc
Two
est la plus grande chaîne.Document 5 :Deux dates sont fournies, la date la plus tardive est donc renvoyée.
Document 6 :Dans ce cas, un objet Date et une chaîne de date sont fournis. Les objets Date sont supérieurs aux chaînes, et donc l'objet Date est renvoyé (même si sa date est antérieure à celle de la chaîne).
Étapes disponibles
$max
est disponible dans les étapes suivantes :
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
étape qui inclut un$expr
expression