Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Operadores de pipeline de agregación

$minN (acumulador de agregación)

$minN

Nuevo en la versión 5.2.

Devuelve una agregación de los elementos de valor mínimo n dentro de un grupo. Si el grupo contiene menos de n elementos, $minN devuelve todos los elementos del grupo.

{
$minN:
{
input: <expression>,
n: <expression>
}
}
  • input especifica una expresión que es la entrada a $minN. Se evalúa para cada elemento en el grupo y $minN conserva los menores n valores.

  • n limita la cantidad de resultados por grupo y n debe ser una expresión numérica positiva que sea constante o dependa del valor de _id para $group.

  • $minN filtra los valores nulos y ausentes.

Considere la siguiente agregación que devuelve los n documentos mínimos de un grupo:

db.aggregate( [
{
$documents: [
{ playerId: "PlayerA", gameId: "G1", score: 1 },
{ playerId: "PlayerB", gameId: "G1", score: 2 },
{ playerId: "PlayerC", gameId: "G1", score: 3 },
{ playerId: "PlayerD", gameId: "G1" },
{ playerId: "PlayerE", gameId: "G1", score: null }
]
},
{
$group:
{
_id: "$gameId",
minimumThreeScores:
{
$minN:
{
input: "$score",
n: 4
}
}
}
}
] )

En este ejemplo:

  • $documents crea los documentos literales que contienen las puntuaciones de los jugadores.

  • $group agrupa los documentos por gameId. Este ejemplo tiene solo un gameId, G1.

  • PlayerD tiene una puntuación faltante y PlayerE tiene un score nulo. Ambos valores se ignoran.

  • El campo minimumThreeScores se especifica como $minN con input : "$score" y se devuelve como un arreglo.

  • Dado que solo hay 3 documentos con scores minN devuelve los 3 campos score mínimos aunque n = 4.

[
{
_id: 'G1',
minimumThreeScores: [ 1, 2, 3 ]
}
]

Tanto los acumuladores $minN como los $bottomN pueden lograr resultados similares.

En general:

  • $minN tiene la ventaja de encontrar valores mínimos sin un orden específico de clasificación. Si desea conocer los valores mínimos de n documentos, utilice $minN.

  • Si garantizar un orden de clasificación específico es un requisito, utiliza $bottomN.

  • Utiliza $bottomN si no tienes la intención de ordenar los valores de salida.

Puede usar $minN como un acumulador.

$minN está soportado como una expresión de agregación.

$minN es compatible como un window operator.

Las pipelines de agregación que llaman a $minN están sujetas al límite de 100 MB. Si se supera este límite para un grupo individual, la agregación falla con un error.

Considera una colección gamescores con los siguientes documentos:

db.gamescores.insertMany([
{ playerId: "PlayerA", gameId: "G1", score: 31 },
{ playerId: "PlayerB", gameId: "G1", score: 33 },
{ playerId: "PlayerC", gameId: "G1", score: 99 },
{ playerId: "PlayerD", gameId: "G1", score: 1 },
{ playerId: "PlayerA", gameId: "G2", score: 10 },
{ playerId: "PlayerB", gameId: "G2", score: 14 },
{ playerId: "PlayerC", gameId: "G2", score: 66 },
{ playerId: "PlayerD", gameId: "G2", score: 80 }
])

Puede usar el acumulador $minN para encontrar las tres puntuaciones más bajas en un solo juego.

db.gamescores.aggregate( [
{
$match : { gameId : "G1" }
},
{
$group:
{
_id: "$gameId",
minScores:
{
$minN:
{
input: ["$score","$playerId"],
n:3
}
}
}
}
] )

La pipeline de ejemplo:

  • Utiliza $match para filtrar los resultados en un solo gameId. En este caso, G1.

  • Usa $group para agrupar los resultados por gameId. En este caso, G1.

  • Especifica los campos que son datos para $minN con input : ["$score","$playerId"].

  • Utiliza $minN para devolver los primeros tres elementos de puntuación para el juego G1 con n : 3.

La operación devuelve los siguientes resultados:

[
{
_id: 'G1',
minScores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ]
}
]

Puedes utilizar el acumulador $minN para encontrar los n puntajes mínimos en cada juego.

db.gamescores.aggregate( [
{
$group:
{
_id: "$gameId",
minScores:
{
$minN:
{
input: ["$score","$playerId"],
n: 3
}
}
}
}
] )

La pipeline de ejemplo:

  • Utiliza $group para agrupar los resultados por gameId.

  • Utiliza $minN para devolver los tres elementos de puntuación mínimos de cada juego con n: 3.

  • Especifica los campos que son datos para $minN con input: ["$score","$playerId"].

La operación devuelve los siguientes resultados:

[
{
_id: 'G2',
minScores: [ [ 10, 'PlayerA' ], [ 14, 'PlayerB' ], [ 66, 'PlayerC' ] ]
},
{
_id: 'G1',
minScores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ]
}
]

También puede asignar dinámicamente el valor de n. En este ejemplo, se utiliza la expresión $cond en el campo gameId.

db.gamescores.aggregate([
{
$group:
{
_id: {"gameId": "$gameId"},
gamescores:
{
$minN:
{
input: ["$score","$playerId"],
n: { $cond: { if: {$eq: ["$gameId","G2"] }, then: 1, else: 3 } }
}
}
}
}
] )

La pipeline de ejemplo:

  • Utiliza $group para agrupar los resultados por gameId.

  • Especifica los campos que se ingresan para $minN con input : ["$score","$playerId"].

  • Si el gameId es G2 entonces n es 1, de lo contrario n es 3.

La operación devuelve los siguientes resultados:

[
{ _id: { gameId: 'G2' }, gamescores: [ [ 10, 'PlayerA' ] ] },
{
_id: { gameId: 'G1' },
gamescores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ]
}
]

Volver

$min

En esta página