Definição
$maxNRetorna uma aggregation do valor máximo de
nelementos dentro de um grupo. Se o grupo tiver menos denelementos,$maxNretornará todos os elementos no grupo.
O acumulador $maxN está disponível nos seguintes estágios:
Observação
Outros usos de $maxN
Esta página descreve $maxN quando usado como acumulador. Os acumuladores retornam um valor agregado como soma, máximo ou mínimo em um grupo de documentos de entrada.
Você também pode usar $maxN nestes outros contextos:
$maxN (expression), que retorna os maiores valoresnde uma array.$maxN (window function), que é usado no estágio$setWindowFieldspara retornar os maiores valoresnde documentos em uma janela específica.
Sintaxe
{ $maxN: { input: <expression>, n: <expression> } }
Campo | Tipo | Descrição |
|---|---|---|
| Expressão | A expressão avaliada para cada elemento no grupo. |
| Expressão | O número de elementos que |
Comportamento
Tipo de resultado
Quando $maxN compara valores de tipos diferentes, a ordem dos tipos segue a ordem de comparação BSON.
Valores nulos e ausentes
$maxN filtra valores nulos e ausentes.
A seguinte agregação demonstra como o $maxN lida com valores nulos e ausentes:
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 ] } ]
Neste exemplo:
$documentscria os documentos literais que contêm classificações de filmes.$groupagrupa os documentos porgenre. Este exemplo tem apenas umgenre,Drama.Magnoliatem umratingausente eDogmatem umratingnulo. Ambos os valores são filtrados.Como apenas 3 documentos têm classificações válidas,
$maxNretorna valores 3 mesmo quen = 4.
Comparação de acumuladores $maxN e $topN
Você pode usar $maxN ou $topN para retornar os elementos n com a classificação mais alta de um grupo. A escolha entre eles depende se seus documentos de entrada já estão classificados.
Se os documentos de entrada já estiverem classificados, use
$maxNpara retornar os valores máximos den.Se você precisar classificar e selecionar os principais elementos
nao mesmo tempo, use$topNpara fazer ambos com um único acumulador.
Exemplos
Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Encontre os três filmes mais bem avaliados em um único ano
Você pode usar o acumulador $maxN para encontrar as três classificações mais altas do IMDb para filmes lançados em um único ano.
db.movies.aggregate( [ { $match: { year: 1999, "imdb.rating": { $exists: true } } }, { $group: { _id: 1999, topThreeRatings: { $maxN: { input: "$imdb.rating", n: 3 } } } } ] )
O pipeline anterior:
Usa
$matchpara filtrar filmes lançados em1999que têm um campoimdb.rating.Agrupa todos os documentos correspondentes em um único grupo com
_id: 1999.Especifica
"$imdb.rating"comoinputpara$maxN.Usa
$maxNpara retornar as três classificações mais altas comn: 3.
Encontre os três filmes mais bem avaliados em vários anos
Você pode usar o acumulador $maxN para encontrar os três filmes mais bem avaliados de cada ano em um conjunto de anos.
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 } } ] )
O pipeline anterior:
Usa
$matchpara filtrar filmes lançados em1999,2000ou2001que tenham um campoimdb.rating.Utiliza
$grouppara agrupar filmes poryear.Especifica
"$imdb.rating"comoinputpara$maxN.Usa
$maxNpara retornar as três classificações mais altas por ano comn: 3.Classifica os resultados por ano em ordem crescente.
Definir n com base na chave do grupo
Você pode atribuir o valor de n dinamicamente com base na chave do grupo. Neste exemplo, a expressão $cond utiliza o campo year para alterar o 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 } } ] )
O pipeline anterior:
Filtros para filmes lançados em
1999,2000ou2001que tenham um campoimdb.rating.Agrupa filmes por
year.Usa a expressão
$condpara retornar classificações de3para o ano2001e classificação1para todos os outros anos.
Na saída, 2001 retorna três classificações, enquanto 1999 e 2000 retornam uma classificação.