Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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, $min tiene una de dos 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 hay algunos, pero no todos, los documentos para la $min operación tienen ya sea un valor de null para el campo o les falta el campo, el operador $min solo considera los valores no nulos y no ausentes para el 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 $project para calcular la puntuación mínima del examen, la puntuación mínima del laboratorio y el mínimo entre la calificación final y la de mitad de semestre:

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 límite inferior de unbounded y el documento current en el resultado. 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