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 en un grupo de documentos de entrada.
También puede usar $top en estos otros contextos:
$top (expression operator), que devuelve el elemento principal de un arreglo según un orden de acomodo especificado.$top (window function), utilizado en la etapa$setWindowFieldspara devolver el elemento superior de los documentos de una ventana determinada.
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.
Dado que la clasificación está en { "score": -1 } descendente, los valores de string se clasifican antes de la puntuación numérica de PlayerA. $top devuelve el primer elemento después de ordenar, 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 la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si realizó alguna modificación en las bases de datos de muestra, es posible que deba descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Buscar la calificación más alta en un género
Puede utilizar 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 por películas de comedia con una calificación positiva de 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$topdevuelve.
Encuentra la calificación más alta entre múltiples calificaciones
Puede utilizar 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.