Definición
Devuelve el elemento principal dentro de un grupo según el orden de acomodo especificado.
Nota
Desambiguación
Esta página describe $top cuando se utiliza como acumulador. Los acumuladores devuelven un único valor agregado a partir de un grupo de documentos de entrada.
También puedes usar $top en estos otros contextos:
$top (expression operator), que devuelve el elemento superior de una matriz según un orden de clasificación especificado.$top (window function), utilizado en la etapa$setWindowFieldspara devolver el elemento superior de los documentos en una ventana en particular.
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 para 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 }.PlayerDyPlayerEempataron por el primer elemento.PlayerDse devuelve como el principalscore.Para tener un comportamiento de empate más determinista para múltiples valores nulos, añada más campos a
sortBy.
Orden de clasificación del tipo de datos BSON
Al ordenar diferentes tipos, se utiliza el orden de los tipos de datos BSON para determinar el orden. Como ejemplo, consideremos una colección cuyos valores consisten en cadenas y números.
En una ordenación ascendente, los valores de string se ordenan después de los valores numéricos.
En una ordenación descendente, los valores de string se ordenan antes que los valores numéricos.
En este ejemplo:
PlayerAtiene una puntuación entera.PlayerBtiene una puntuación de string"2".PlayerCtiene un puntaje de string vacía.
Debido a que la ordenación es descendente { "score": -1 }, los valores de cadena se ordenan antes que la puntuación numérica de PlayerA. $top devuelve el primer elemento después de la ordenación, que es PlayerB:
db.aggregate( [ { $documents: [ { playerId: "PlayerA", gameId: "G1", score: 1 }, { playerId: "PlayerB", gameId: "G1", score: "2" }, { playerId: "PlayerC", gameId: "G1", score: "" } ] }, { $group: { _id: "$gameId", playerId: { $top: { output: [ "$playerId", "$score" ], sortBy: { "score": -1 } } } } } ] )
Ejemplos
Los ejemplos de esta página utilizan datos del conjunto de datos sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en su implementación autogestionada de MongoDB, consulte Cargar el conjunto de datos de ejemplo. Si realizó alguna modificación en las bases de datos de ejemplo, es posible que deba eliminarlas y volver a crearlas para ejecutar los ejemplos de esta página.
Encuentra la mejor calificación en un género
Puedes usar el acumulador $top para encontrar la película mejor valorada en un género.
db.movies.aggregate( [ { $match: { genres: "Comedy", "imdb.rating": { $gt: 0 } } }, { $group: { _id: "Comedy", highestRatedMovie: { $top: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1 } } } } } ] )
La pipeline de ejemplo:
Utiliza
$matchpara filtrar películas de comedia con una calificación positiva en IMDb.Utiliza
$grouppara agrupar todas las películas de comedia bajo una única clave de grupo"Comedy".Especifica los campos que se muestran para
$topconoutput : ["$title", "$imdb.rating"].Utiliza
sortBy: { "imdb.rating": -1 }para clasificar las películas dentro del grupo por calificación de IMDb en orden descendente, lo que determina la película que devuelve$top.
Encuentra la mejor calificación entre múltiples calificaciones.
Puedes usar el acumulador $top para encontrar la película mejor valorada para cada categoría de calificación de películas.
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, "imdb.rating": { $gt: 0 } } }, { $group: { _id: "$rated", highestRatedMovie: { $top: { output: [ "$title", "$imdb.rating" ], sortBy: { "imdb.rating": -1 } } } } }, { $sort: { _id: 1 } } ] )
La pipeline de ejemplo:
Utiliza
$matchpara filtrar películas en las categoríasG,PG,PG-13yRcon una calificación positiva de IMDb.Utiliza
$grouppara agrupar los resultados porrated.Utiliza
$toppara devolver la película mejor valorada de cada categoría.Especifica los campos que se muestran para
$topconoutput : ["$title", "$imdb.rating"].Utiliza
sortBy: { "imdb.rating": -1 }para clasificar las películas dentro de cada grupo por calificación de IMDb en orden descendente, lo que determina la película que devuelve$top.Utiliza
$sortpara ordenar los resultados alfabéticamente por categoría de calificación.