Definición
Sintaxis
{ $minN: { input: <expression>, n: <expression> } }
inputEspecifica una expresión que sirve de entrada a$minN. Se evalúa para cada elemento del grupo y$minNconserva los valores mínimos den.nlimita el número de resultados por grupo yntiene que ser una expresión integral positiva que sea una constante o dependa del valor_idpara$group.
Comportamiento
Valores nulos y faltantes
$minNfiltra valores nulos y faltantes.
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 documentosgameIdpor. Este ejemplo solo tiene un,.gameIdG1PlayerDtiene una puntuación faltante yPlayerEtiene un valor nuloscore. Ambos valores se ignoran.El
minimumThreeScorescampo se especifica como$minNconinput : "$score"y se devuelve como una matriz.Dado que solo hay 3 documentos con
scores,minNdevuelve el mínimo de 3scorecampos aunquen = 4.
[ { _id: 'G1', minimumThreeScores: [ 1, 2, 3 ] } ]
Comparación de $minN los $bottomN acumuladoresy
$minN $bottomN Los acumuladores y 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 particular es un
$bottomNrequisito, utilice.Utilice si no desea ordenar los valores de
$bottomNsalida.
Restricciones
Compatibilidad con funciones de ventana y expresiones de agregación
Puedes utilizar como $minN acumulador.
$minN se admite como 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
Puedes utilizar el acumulador $minN para encontrar las tres puntuaciones mínimas 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 se ingresan 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 las puntuaciones mínimas n 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 se ingresan 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
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' ] ] } ]