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.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
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 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:
{
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

O número de elementos que $maxN retorna do grupo. Para obter um exemplo de configuração n dinamicamente, consulte Definir n com base na chave de grupo.

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

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

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

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

  • Magnolia tem um rating ausente e Dogma tem um rating nulo. Ambos os valores são filtrados.

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

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

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

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.

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 $match para filtrar filmes lançados em 1999 que têm um campoimdb.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 classificações mais altas com n: 3.

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 $match para filtrar filmes lançados em 1999, 2000 ou 2001 que tenham um campoimdb.rating.

  • Utiliza $group para agrupar filmes por year.

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

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

  • Classifica 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 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, 2000 ou 2001 que tenham um campoimdb.rating.

  • Agrupa filmes por year.

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

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