Definición
$maxNDevuelve una agregación de los elementos con el valor máximo
ndentro de un grupo. Si el grupo contiene menos denelementos,$maxNdevuelve todos los elementos del grupo.
El acumulador $maxN está disponible en estas etapas:
Nota
Otros usos de $maxN
Esta página describe el uso de $maxN como acumulador. Los acumuladores devuelven un valor agregado, como la suma, el máximo o el mínimo, de un grupo de documentos de entrada.
También puedes usar $maxN en estos otros contextos:
$maxN (expression), que devuelve los valoresnmás grandes de una matriz.$maxN (window function), que se utiliza en la etapa$setWindowFieldspara devolver los valoresnmás grandes de los documentos en una ventana en particular.
Sintaxis
{ $maxN: { input: <expression>, n: <expression> } }
Campo | Tipo | Descripción |
|---|---|---|
| expresión | La expresión evaluada para cada elemento del grupo. |
| expresión | El número de elementos que |
Comportamiento
Tipo de resultado
Cuando $maxN compara valores de diferentes tipos, el orden de los tipos sigue el orden de comparación BSON.
Valores nulos y faltantes
$maxN filtra los valores nulos y ausentes.
La siguiente agregación demuestra cómo $maxN maneja los valores nulos y faltantes:
db.aggregate( [ { $documents: [ { title: "Fight Club", genre: "Drama", rating: 8.9 }, { title: "The Matrix", genre: "Drama", rating: 8.7 }, { title: "The Green Mile", genre: "Drama", rating: 8.5 }, { title: "Magnolia", genre: "Drama" }, { title: "Dogma", genre: "Drama", rating: null } ] }, { $group: { _id: "$genre", topFourRatings: { $maxN: { input: "$rating", n: 4 } } } } ] )
[ { _id: 'Drama', topFourRatings: [ 8.9, 8.7, 8.5 ] } ]
En este ejemplo:
$documentscrea los documentos literales que contienen las calificaciones de las películas.$groupagrupa los documentos porgenre. Este ejemplo tiene solo ungenre,Drama.Magnoliatiene unratingfaltante yDogmatiene unratingnulo. Ambos valores se filtran.Dado que solo los documentos 3 tienen calificaciones válidas,
$maxNdevuelve valores 3 aunquen = 4.
Comparación de los acumuladores $maxN y $topN
Puedes usar $maxN o $topN para devolver los elementos n mejor clasificados de un grupo. La elección entre ellos depende de si tus documentos de entrada ya están ordenados.
Si los documentos de entrada ya están ordenados, utilice
$maxNpara devolver los valores máximos den.Si necesita ordenar y seleccionar los elementos
nsuperiores al mismo tiempo, utilice$topNpara lograr ambas cosas con un solo acumulador.
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 las tres películas mejor valoradas de un solo año.
Puedes usar el acumulador $maxN para encontrar las tres calificaciones más altas de IMDb para películas estrenadas en un solo año.
db.movies.aggregate( [ { $match: { year: 1999, "imdb.rating": { $exists: true } } }, { $group: { _id: 1999, topThreeRatings: { $maxN: { input: "$imdb.rating", n: 3 } } } } ] )
La tubería precedente:
Utiliza
$matchpara filtrar las películas estrenadas en1999que tienen un campoimdb.rating.Agrupa todos los documentos coincidentes en un único grupo con
_id: 1999.Especifica
"$imdb.rating"comoinputpara$maxN.Utiliza
$maxNpara devolver las tres calificaciones más altas conn: 3.
Encuentra las tres películas mejor valoradas de varios años.
Puedes usar el acumulador $maxN para encontrar las tres películas mejor valoradas de cada año en un conjunto de años.
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2000, 2001 ] }, "imdb.rating": { $exists: true } } }, { $group: { _id: "$year", topThreeRatings: { $maxN: { input: "$imdb.rating", n: 3 } } } }, { $sort: { _id: 1 } } ] )
La tubería precedente:
Utiliza
$matchpara filtrar películas estrenadas en1999,2000o2001que tengan un campoimdb.rating.Utiliza
$grouppara agrupar películas poryear.Especifica
"$imdb.rating"comoinputpara$maxN.Utiliza
$maxNpara devolver las tres calificaciones más altas por año conn: 3.Ordena los resultados por año en orden ascendente.
Establecer n en función de la clave de grupo.
Puede asignar el valor de n dinámicamente en función de la clave de grupo. En este ejemplo, la expresión $cond utiliza el campo year para cambiar el valor de n:
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2000, 2001 ] }, "imdb.rating": { $exists: true } } }, { $group: { _id: { year: "$year" }, topRatedMovies: { $maxN: { input: "$imdb.rating", n: { $cond: { if: { $eq: [ "$year", 2001 ] }, then: 3, else: 1 } } } } } }, { $sort: { "_id.year": 1 } } ] )
La tubería precedente:
Filtros para películas estrenadas en
1999,2000o2001que tengan un campoimdb.rating.Agrupa las películas por
year.
En la salida, 2001 devuelve tres calificaciones, mientras que 1999 y 2000 devuelven una calificación cada una.