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
/ /

$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 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 $minN es el más bajo en el orden de comparación.

  • $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 devuelto 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 de clasificación específico. Si desea conocer los valores mínimos de los n documentos,$minN utilice.

  • 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 se admite window operator como.

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
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza para filtrar los resultados según un $match único.gameId En esteG1 caso,.

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

  • 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
}
}
}
}
] )

El ejemplo de canalización:

  • Utiliza $group para agrupar los resultados por gameId.

  • Utiliza $minN para devolver los tres elementos de puntuación mínimos para 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 el valor n dinámicamente. En este ejemplo,$cond se utiliza la expresión en el gameId campo.

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

El ejemplo de canalización:

  • 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