Definición
Sintaxis
{ $top: { sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } }
Campo | Necesidad | Descripción |
|---|---|---|
sortBy | Requerido | Especifica el orden de los resultados, con una sintaxis similar a
|
salida | Requerido | Representa la salida de cada elemento del grupo y puede ser cualquier expresión. |
Comportamiento
Valores nulos y faltantes
Considera la siguiente agregación que devuelve el documento más alto de un grupo de puntuaciones:
$topno filtra los valores nulos.$topconvierte los valores faltantes en null.
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", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": 1 } } } } } ] )
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. Estos valores se consideran ambos nulos.Los campos
playerIdyscorese especifican comooutput : ["$playerId"," $score"]y se devuelven como valores de un arreglo.Especifica el orden de clasificación con
sortBy: { "score": 1 }.PlayerDyPlayerEempató en el elemento superior.PlayerDse devuelve como elscoresuperior.Para tener un comportamiento de desempate más determinista para múltiples valores nulos, agregue más campos a
sortBy.
[ { _id: 'G1', playerId: [ 'PlayerD', null ] } ]
Restricciones
Compatibilidad con funciones de ventana y expresiones de agregación
$top no es compatible como expresión de agregación.
$top es compatible como un window operator.
Consideraciones sobre el límite de memoria
Las pipelines de agregación que llaman a $top 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 } ])
Encontrar la parte superior Score
Puedes utilizar el acumulador $top para encontrar la puntuación más alta en un solo juego.
db.gamescores.aggregate( [ { $match : { gameId : "G1" } }, { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
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 muestran para
$topconoutput : ["$playerId"," $score"].Utiliza
sortBy: { "score": -1 }para ordenar los puntajes en orden descendente.Utiliza
$toppara devolver la puntuación más alta en el juego.
La operación devuelve los siguientes resultados:
[ { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]
Encuentra los mejores Score en varios juegos
Puedes usar el acumulador $top para encontrar los mejores score en cada juego.
db.gamescores.aggregate( [ { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
El ejemplo de canalización:
Utiliza
$grouppara agrupar los resultados porgameId.Utiliza
$toppara devolver elscoresuperior para cada juego.Especifica los campos que se muestran para
$topconoutput : ["$playerId", "$score"].Utiliza
sortBy: { "score": -1 }para ordenar los puntajes en orden descendente.
La operación devuelve los siguientes resultados:
[ { _id: 'G2', playerId: [ 'PlayerD', 80 ] }, { _id: 'G1', playerId: [ 'PlayerC', 99 ] } ]