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 nestes estágios:
Observação
Outros usos de $maxN
Esta página descreve $maxN quando usado como um acumulador. 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 valores dende 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 | The number of elements that |
Comportamento
Tipo de resultado
Quando $maxN compara valores de diferentes tipos, a ordem dos tipos segue a ordem de comparação BSON.
Valores nulos e ausentes
$maxN filtra valores nulos e ausentes.
A agregação a seguir demonstra como $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 as classificações de filmes.$groupagrupa os documentos porgenre. Este exemplo tem apenas umgenre,Drama.Magnoliatem umaratingausente eDogmatem umaratingnula. Ambos os valores são filtro.Como apenas 3 documentos têm classificações válidas,
$maxNretorna 3 valores mesmo quen = 4.
Comparação de acumuladores $maxN e $topN
Você pode usar $maxN ou $topN para retornar os n elementos com a classificação mais alta de um grupo. A escolha entre eles depende de se seus documentos de entrada já estão ordenados.
Se os documentos de entrada já estiverem ordenados, use
$maxNpara retornar osnvalores máximos.Se você precisar classificar e selecionar os
nelementos principais ao mesmo tempo, use$topNpara realizar ambas as tarefas com um único acumulador.
Exemplos
Os exemplos nesta página usam dados do conjunto de dados sample_mflix. Para obter detalhes sobre como carregar este conjunto de dados em sua implantação do MongoDB autogerenciado, consulte Carregar o conjunto de dados de amostra. Se você fez alguma modificação nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Encontrar os três filmes mais bem avaliados para um único ano
Você pode usar o acumulador $maxN para encontrar as três maiores classificações 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
$matchcomo filtro para 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 maiores classificações comn: 3.
Encontrar 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 para 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 filtro filmes lançados em1999,2000ou2001que têm um campoimdb.rating.Utiliza
$grouppara agrupar filmes poryear.Especifica
"$imdb.rating"comoinputpara$maxN.Usa
$maxNpara retornar as três maiores classificações por ano comn: 3.Classifique os resultados por ano em ordem crescente.
Definir n com base na chave de grupo
Você pode atribuir o valor de n dinamicamente com base na chave do grupo. Neste exemplo, a expressão $cond usa 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 têm um campoimdb.rating.Agrupa filmes por
year.Usa a
$condexpressão para retornar3avaliações para o ano2001e1avaliação para todos os outros anos.
Na saída, 2001 retorna três avaliações enquanto 1999 e 2000 retornam uma avaliação cada.