Definição
Retorna o resultado de avaliar uma expressão especificada para os últimos n elementos em um grupo. Os resultados só são significativos se os dados de entrada para o estágio de agrupamento tiverem uma ordem de classificação definida. Se o grupo tiver menos de n elementos, $lastN retornará todos os elementos no grupo.
O acumulador $lastN está disponível nestes estágios:
Observação
Desambiguação
Esta página descreve $lastN 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 $lastN nestes outros contextos:
$lastN (expression), que retorna o número especificado de elementos do final de um array.$lastN (window function), que é usado no estágio$setWindowFieldspara retornar os últimosnvalores de documentos em uma janela específica.
Sintaxe
{ $lastN: { input: <expression>, n: <expression> } }
Opções
Campo | Tipo | Descrição |
|---|---|---|
| Expressão | A expressão |
| Expressão | The number of elements that |
Comportamento
Valores nulos e ausentes
$lastNnão filtra valores nulos.$lastNconverte valores ausentes em nulo.
Comparação de $lastN e $bottomN
Você pode usar $lastN e $bottomN para retornar os últimos n elementos de um grupo. No entanto, a diferença entre quando usar cada um depende de se seus documentos de entrada já estão ordenados.
Se os documentos que chegam a
$groupjá estiverem ordenados, você deverá usar$lastN.Se você estiver classificando e selecionando os elementos
ninferiores, poderá usar$bottomNpara realizar ambas as tarefas com um acumulador.
Exemplos
The examples on this page use the movies collection in the sample_mflix sample dataset. To learn how to load the sample dataset into your MongoDB deployment, see Import Sample Data Into Your Atlas Deployment.
Encontrar os últimos três filmes para um único gênero
Você pode usar o acumulador $lastN para encontrar os filmes lançados mais recentemente em um gênero específico.
db.movies.aggregate( [ { $match: { genres: "Horror", year: { $type: "int" } } }, { $sort: { year: 1, title: 1 } }, { $group: { _id: "Horror", lastThreeMovies: { $lastN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
O pipeline anterior:
Usa
$matchpara filtro os resultados para filmes ondeHorrorestá incluído no arraygenrese ondeyearé um número inteiro.Ordena os resultados por
yearem ordem crescente e, em seguida, portitleem ordem alfabética como critério de desempate.Agrupa todos os documentos resultantes em um único grupo.
Especifica os campos que são entrada para
$lastNcominput : ["$title", "$year"].Usa
$lastNpara retornar os três últimos documentos (classificados por ano em ordem crescente, comtitlecomo critério de desempate) para o gêneroHorrorcomn: 3.
Encontrar os últimos três filmes em vários gêneros
Você pode usar o acumulador $lastN para encontrar os últimos n campos de entrada em cada gênero.
db.movies.aggregate( [ { $match: { year: { $type: "int" } } }, { $unwind: "$genres" }, { $sort: { year: 1, title: 1 } }, { $group: { _id: "$genres", movies: { $lastN: { input: [ "$title", "$year" ], n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
O pipeline anterior:
Usa
$matchcomo filtro para filmes ondeyearé um número inteiro.Usa
$unwindpara criar um documento separado para cada gênero no arraygenres.Classifica os resultados por
yearem ordem crescente e, em seguida, portitlealfabeticamente.Utiliza
$grouppara agrupar os resultados porgenres.Usa
$lastNpara retornar os três últimos documentos (por ano crescente, comtitlecomo critério de desempate) para cada gênero comn: 3.Especifica os campos que são entrada para
$lastNcominput : ["$title", "$year"].Limita a saída a cinco documentos para melhorar a legibilidade.
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 rated para alterar o valor de n:
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, year: { $type: "int" }, title: { $regex: "^[A-Za-z0-9]" } } }, { $sort: { title: 1 } }, { $group: { _id: { rated: "$rated" }, movies: { $lastN: { input: "$title", n: { $cond: { if: { $eq: ["$rated", "PG"] }, then: 3, else: 1 } } } } } }, { $sort: { "_id.rated": 1 } } ] )
O pipeline anterior:
Filtros para filmes com classificações de conteúdo de
G,PG,PG-13ouR, ondeyearé um número inteiro etitlecomeça com um caractere alfanumérico.Ordena os resultados alfabeticamente por
title.Agrupa filmes por
rated(a classificação indicativa).Usa a expressão
$condpara retornar3filmes para filmes com classificaçãoPGe1filme para todas as outras classificações.
Na saída, a classificação PG retorna 3 filmes, enquanto as classificações G, PG-13 e R retornam 1 filme cada.