Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$min (operador acumulador)

Modificado en la versión 5.0.

$min

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:

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:

  • $min tiene una expresión especificada como su operando:

    { $min: <expression> }
  • $min tiene una lista de expresiones especificadas como su operando:

    { $min: [ <expression1>, <expression2> ... ] }

Para obtener más información sobre las expresiones, consulta Expresiones.

$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.

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.

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, $min recorre 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, $min no recorre el arreglo sino que lo trata como un valor no numérico.

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 }

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 }

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 en state. Existen particiones para CA y WA.

  • sortBy: { orderDate: 1 } ordena los documentos de cada partición por orderDate en orden ascendente (1), de modo que el orderDate más antiguo sea el primero.

  • output establece el campo minimumQuantityForState en el valor mínimo quantity utilizando $min que se ejecuta en una ventana documentos.

    La ventana contiene documentos entre un unbounded límite inferior de y el current documento en la salida. Esto significa que $min devuelve el mínimo quantity para 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 }

Volver

$mergeObjects

En esta página