Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

$maxN (operador acumulador )

$maxN

Retorna uma aggregation do valor máximo de n elementos dentro de um grupo. Se o grupo tiver menos de n elementos, $maxN retornará 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:
{
input: <expression>,
n: <expression>
}
}
Campo
Tipo
Descrição

input

Expressão

A expressão avaliada para cada elemento no grupo. $maxN preserva os valores máximos de n.

n

Expressão

The number of elements that $maxN returns from the group. For an example of setting n dynamically, see Set n Based on the Group Key.

Quando $maxN compara valores de diferentes tipos, a ordem dos tipos segue a ordem de comparação BSON.

$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:

  • $documents cria os documentos literais que contêm as classificações de filmes.

  • $group agrupa os documentos por genre. Este exemplo tem apenas um genre, Drama.

  • Magnolia tem uma rating ausente e Dogma tem uma rating nula. Ambos os valores são filtro.

  • Como apenas 3 documentos têm classificações válidas, $maxN retorna 3 valores mesmo que n = 4.

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 $maxN para retornar os n valores máximos.

  • Se você precisar classificar e selecionar os n elementos principais ao mesmo tempo, use $topN para realizar ambas as tarefas com um único acumulador.

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.

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 $match como filtro para filmes lançados em 1999 que têm um campo imdb.rating.

  • Agrupa todos os documentos correspondentes em um único grupo com _id: 1999.

  • Especifica "$imdb.rating" como input para $maxN.

  • Usa $maxN para retornar as três maiores classificações com n: 3.

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 $match para filtro filmes lançados em 1999, 2000 ou 2001 que têm um campo imdb.rating.

  • Utiliza $group para agrupar filmes por year.

  • Especifica "$imdb.rating" como input para $maxN.

  • Usa $maxN para retornar as três maiores classificações por ano com n: 3.

  • Classifique os resultados por ano em ordem crescente.

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, 2000 ou 2001 que têm um campo imdb.rating.

  • Agrupa filmes por year.

  • Usa a $cond expressão para retornar 3 avaliações para o ano 2001 e 1 avaliação para todos os outros anos.

Na saída, 2001 retorna três avaliações enquanto 1999 e 2000 retornam uma avaliação cada.