Definición
Sintaxis
{ $minN: { input: <expression>, n: <expression> } }
inputespecifica una expresión que es la entrada a$minN. Se evalúa para cada elemento en el grupo y$minNconserva los menoresnvalores.nlimita la cantidad de resultados por grupo yndebe ser una expresión numérica positiva que sea constante o dependa del valor de_idpara$group.
Comportamiento
Tipo de resultado
$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.
Valores nulos y faltantes
$minNfiltra 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:
$documentscrea los documentos literales que contienen las puntuaciones de los jugadores.$groupagrupa los documentos porgameId. Este ejemplo tiene solo ungameId,G1.PlayerDtiene una puntuación faltante yPlayerEtiene unscorenulo. Ambos valores se ignoran.El campo
minimumThreeScoresse especifica como$minNconinput : "$score"y devuelto como un arreglo.Dado que solo hay 3 documentos con
scoresminNdevuelve los 3 camposscoremínimos aunquen = 4.
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
Comparación de los acumuladores $minN y $bottomN
Tanto los acumuladores $minN como los $bottomN pueden lograr resultados similares.
En general:
$minNtiene la ventaja de encontrar valores mínimos sin un orden de clasificación específico. Si desea conocer los valores mínimos de losndocumentos,$minNutilice.Si garantizar un orden de clasificación específico es un requisito, utiliza
$bottomN.Utiliza
$bottomNsi no tienes la intención de ordenar los valores de salida.
Restricciones
Compatibilidad con funciones de ventana y expresiones de agregación
Puede usar $minN como un acumulador.
$minN está soportado como una expresión de agregación.
$minN se admite window operator como.
Consideraciones sobre el límite de memoria
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.
Ejemplos
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 } ])
Encuentra el mínimo de tres Scores para un solo juego
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.gameIdEn esteG1caso,.Usa para agrupar los
$groupresultadosgameIdpor. En esteG1caso,.Especifica los campos que son datos para
$minNconinput : ["$score","$playerId"].Utiliza
$minNpara devolver los primeros tres elementos de puntuación para el juegoG1conn : 3.
La operación devuelve los siguientes resultados:
[ { _id: 'G1', minScores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ] } ]
Encontrar los tres documentos mínimos entre varios juegos
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
$grouppara agrupar los resultados porgameId.Utiliza
$minNpara devolver los tres elementos de puntuación mínimos para cada juego conn: 3.Especifica los campos que son datos para
$minNconinput: ["$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' ] ] } ]
Cálculo n de según la clave de grupo para $group
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
$grouppara agrupar los resultados porgameId.Especifica los campos que se ingresan para
$minNconinput : ["$score","$playerId"].Si el
gameIdesG2entoncesnes 1, de lo contrariones 3.
La operación devuelve los siguientes resultados:
[ { _id: { gameId: 'G2' }, gamescores: [ [ 10, 'PlayerA' ] ] }, { _id: { gameId: 'G1' }, gamescores: [ [ 1, 'PlayerD' ], [ 31, 'PlayerA' ], [ 33, 'PlayerB' ] ] } ]