Definición
Modificado en la versión 5.0.
Devuelve el valor mínimo. $min compara tanto el valor como el tipo, utilizando el orden de comparación BSON especificado para valores de diferentes tipos.
$min 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, $min tiene esta sintaxis:
{ $min: <expression> }
Cuando se utiliza en otras etapas compatibles, tiene una de dos$min sintaxis:
$mintiene una expresión especificada como su operando:{ $min: <expression> } $mintiene una lista de expresiones especificadas como su operando:{ $min: [ <expression1>, <expression2> ... ] }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Tipo de resultado
$min 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 output $min es el más bajo en el orden de comparación.
Valores nulos o faltantes
Si algunos, pero no todos, los documentos para la operación tienen $min un null valor para el campo o les falta el campo, el operador solo considera los valores no nulos y no faltantes para el $min campo.
Si todos los documentos para la operación $min tienen el null valor para el campo o no tienen el campo, el operador $min devuelve null para el valor mínimo.
Arreglo Operand
En las etapas $group y $setWindowFields, si la expresión resuelve un arreglo, $min 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,
$minrecorre 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,
$minno 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 $min para calcular la cantidad mínima y la cantidad mínima para cada agrupación.
db.sales.aggregate( [ { $group: { _id: "$item", minQuantity: { $min: "$quantity" } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : "xyz", "minQuantity" : 5 } { "_id" : "jkl", "minQuantity" : 1 } { "_id" : "abc", "minQuantity" : 2 }
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 $min en la etapa para calcular los puntajes mínimos del cuestionario, los puntajes mínimos del laboratorio y el mínimo del examen final y del examen $project parcial:
db.students.aggregate([ { $project: { quizMin: { $min: "$quizzes"}, labMin: { $min: "$labs" }, examMin: { $min: [ "$final", "$midterm" ] } } } ])
La operación da como resultado los siguientes documentos:
{ "_id" : 1, "quizMin" : 6, "labMin" : 5, "examMin" : 75 } { "_id" : 2, "quizMin" : 9, "labMin" : 8, "examMin" : 80 } { "_id" : 3, "quizMin" : 4, "labMin" : 5, "examMin" : 70 }
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 $min en la etapa $setWindowFields para mostrar el mínimo quantity de las ventas de pasteles para cada state:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { minimumQuantityForState: { $min: "$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 campominimumQuantityForStateen el valor mínimoquantityutilizando$minque se ejecuta en una ventana documentos.La ventana contiene documentos entre un
unboundedlímite inferior de y elcurrentdocumento en la salida. Esto significa que$mindevuelve el mínimoquantitypara los documentos entre el inicio de la partición y el documento actual.
En esta salida, el mínimo quantity para CA y WA se muestra en el campo minimumQuantityForState:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "minimumQuantityForState" : 162 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "minimumQuantityForState" : 120 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "minimumQuantityForState" : 120 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "minimumQuantityForState" : 134 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "minimumQuantityForState" : 104 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "minimumQuantityForState" : 104 }