Definición
Modificado en la versión 5.0.
Devuelve el valor máximo. $max compara tanto el valor como el tipo, utilizando el orden de comparación BSON especificado para valores de diferentes tipos.
$max está disponible en estas etapas:
$setWindowFields(Disponible a partir de MongoDB 5.0)
Sintaxis
Cuando se usa en las etapas $bucket, $bucketAuto, $group y $setWindowFields, $max tiene esta sintaxis:
{ $max: <expression> }
Cuando se utiliza en otras etapas compatibles, tiene una de dos$max sintaxis:
$maxtiene una expresión especificada como su operando:{ $max: <expression> } $maxtiene una lista de expresiones especificadas como su operando:{ $max: [ <expression1>, <expression2> ... ] }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Tipo de resultado
$max compara los datos de entrada siguiendo el orden de comparación BSON para determinar el tipo de resultado adecuado. Cuando los datos de entrada contienen múltiples tipos de datos, el tipo de salida $max es el más alto en el orden de comparación.
Valores nulos o faltantes
Si algunos, pero no todos, los documentos para la operación tienen $max un null valor para el campo o les falta el campo, el operador solo considera los valores no nulos y no faltantes para el $max campo.
Si todos los documentos para la operación $max tienen el valor null para el campo o faltan el campo, el operador $max devuelve null para el valor máximo.
Arreglo Operand
En las etapas $group y $setWindowFields, si la expresión resuelve un arreglo, $max no recorre el arreglo y compara el arreglo como un todo.
En las otras etapas admitidas:
Con una única expresión como operando, si la expresión se resuelve en un arreglo,
$maxrecorre el arreglo para operar sobre sus elementos numéricos y devolver un único valor.Con una lista de expresiones como su operando, si alguna de las expresiones se resuelve en un arreglo,
$maxno recorre el arreglo sino que lo trata como un valor no numérico.
Ejemplos
Usar en la etapa $group
Considera una colección sales con los siguientes documentos:
db.sales.insertMany ( [ { _id : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }, { _id : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }, { _id : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }, { _id : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }, { _id : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") } ] )
Agrupando los documentos por el campo item, la siguiente operación utiliza el acumulador $max para calcular el monto total máximo y la cantidad máxima para cada grupo de documentos.
db.sales.aggregate( [ { $group: { _id: "$item", maxTotalAmount: { $max: { $multiply: [ "$price", "$quantity" ] } }, maxQuantity: { $max: "$quantity" } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : "xyz", "maxTotalAmount" : 50, "maxQuantity" : 10 } { "_id" : "jkl", "maxTotalAmount" : 20, "maxQuantity" : 1 } { "_id" : "abc", "maxTotalAmount" : 100, "maxQuantity" : 10 }
Usar en la etapa $project
Una colección students contiene los siguientes documentos:
db.students.insertMany( [ { _id: 1, "quizzes": [ 10, 6, 7 ], "labs": [ 5, 8 ], "final": 80, "midterm": 75 }, { _id: 2, "quizzes": [ 9, 10 ], "labs": [ 8, 8 ], "final": 95, "midterm": 80 }, { _id: 3, "quizzes": [ 4, 5, 5 ], "labs": [ 6, 5 ], "final": 78, "midterm": 70 } ] )
El siguiente ejemplo utiliza el $max en la etapa $project para calcular las puntuaciones máximas de los cuestionarios, las puntuaciones máximas de los laboratorios y el máximo entre la nota final y la intermedia:
db.students.aggregate([ { $project: { quizMax: { $max: "$quizzes"}, labMax: { $max: "$labs" }, examMax: { $max: [ "$final", "$midterm" ] } } } ])
La operación da como resultado los siguientes documentos:
{ "_id" : 1, "quizMax" : 10, "labMax" : 8, "examMax" : 80 } { "_id" : 2, "quizMax" : 10, "labMax" : 8, "examMax" : 95 } { "_id" : 3, "quizMax" : 5, "labMax" : 6, "examMax" : 78 }
Usar en la etapa $setWindowFields
Nuevo en la versión 5.0.
Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y Washington (WA):
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
Este ejemplo utiliza $max en la etapa para generar el $setWindowFields máximo quantity de ventas de pasteles para state cada:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { maximumQuantityForState: { $max: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
En el ejemplo:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { orderDate: 1 }ordena los documentos de cada partición pororderDateen orden ascendente (1), de modo que elorderDatemás antiguo sea el primero.
outputestablece el campomaximumQuantityForStateen el valor máximoquantityusando$maxque se ejecuta en una ventana de documentos.La ventana contiene documentos entre un
unboundedlímite inferior y elcurrentdocumento en el resultado. Esto significa que$maxdevuelve el máximoquantitypara los documentos entre el principio de la partición y el documento actual.
En este resultado, el máximo quantity para CA y WA se muestra en el campo maximumQuantityForState:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "maximumQuantityForState" : 162 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "maximumQuantityForState" : 162 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "maximumQuantityForState" : 162 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "maximumQuantityForState" : 134 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "maximumQuantityForState" : 134 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "maximumQuantityForState" : 140 }