Definición
Devuelve los elementos n superiores dentro de una ventana particular, según el orden de clasificación especificado.
Nota
Otros usos de $topN
Esta página describe $topN cuando se utiliza como función de ventana.
También puedes usar $topN en estos otros contextos:
$topN (accumulator), que devuelve losnelementos superiores dentro de un grupo según el orden de clasificación especificado.$topN (expression), que devuelve losnelementos superiores de una matriz.
Sintaxis
{ $setWindowFields: { ... output: { <field>: { $topN: { n: <expression>, output: <expression>, sortBy: { <field1>: <sort order>, <field2>: <sort order>, ... } } } } } }
opciones
Campo | Necesidad | Descripción |
|---|---|---|
| Requerido | Número de resultados a devolver. Debe redondearse a un valor entero positivo. Si la ventana contiene menos de |
| Requerido | Determina la salida para cada documento en la ventana. Puede ser cualquier expresión. |
| Requerido | Define el orden de clasificación de los elementos dentro de la ventana, con una sintaxis similar a |
Comportamiento
Valores nulos y faltantes
$topNno filtra los valores nulos.$topNconvierte los valores faltantes en null.
Ejemplo
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 las tres películas mejor valoradas en una ventana
Este ejemplo utiliza $topN en $setWindowFields para devolver cada película con las tres películas mejor valoradas estrenadas en el mismo año.
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2001 ] }, "imdb.rating": { $gte: 8.5 } } }, { $setWindowFields: { partitionBy: "$year", output: { topThreeRatedInYear: { $topN: { sortBy: { "imdb.rating": -1, title: 1 }, output: { rating: "$imdb.rating", title: "$title" }, n: 3 }, window: { documents: [ "unbounded", "unbounded" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.rating": 1, topThreeRatedInYear: 1 } }, { $sort: { year: 1, "imdb.rating": -1 } } ] )
En el ejemplo precedente:
$matchfiltra películas estrenadas en1999o2001con una calificación IMDb de al menos8.5.$setWindowFieldsdivide los documentos poryear.window: { documents: [ "unbounded", "unbounded" ] }abarca toda la partición del año, por lo que$topNconsidera todos los documentos del año al determinar las tres películas mejor calificadas.$topNUtilizasortBy: { "imdb.rating": -1, title: 1 }para clasificar las películas según su puntuación en IMDb ytitlecomo criterio de desempate. Todos los documentos del mismo año reciben el mismo valortopThreeRatedInYear.$projectElimina los campos innecesarios para resaltar el resultado de la función de ventana.$sortOrdena los resultados por año en orden ascendente y por calificación en orden descendente.