Definição
Retorna o resultado da avaliação de uma expressão especificada sobre os últimos elementos n em um grupo. Os resultados serão significativos somente 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 nos seguintes estágios:
Observação
Desambiguação
Esta página descreve $lastN 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 $lastN nestes outros contextos:
$lastN (expression), que retorna o número especificado de elementos do final de uma array.$lastN (window function), que é usado no estágio$setWindowFieldspara retornar os últimos valoresnde 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 | O número de elementos que |
Comportamento
Valores nulos e ausentes
$lastNnão filtra valores nulos.$lastNconverte valores ausentes em nulo.
Comparação de $lastN e $bottomN
Você pode utilizar $lastN e $bottomN para retornar os últimos elementos n de um grupo. No entanto, a diferença de quando usar cada um depende se os documentos de entrada já estão classificados.
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
Os exemplos nesta página utilizam a collection movies no conjunto de dados de amostra sample_mflix. Para saber como carregar o conjunto de dados de amostra em sua implantação do MongoDB , consulte Importar dados de amostra para sua implantação do Atlas .
Encontre os últimos três filmes de um único gênero
Você pode usar o acumulador $lastN para encontrar os filmes lançados mais recentemente de 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:
Utiliza
$matchpara filtrar os resultados para filmes em queHorrorestá incluído na arraygenrese ondeyearé um número inteiro.Classifica os resultados por
yearem ordem crescente e, em seguida, portitlealfabeticamente como 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 últimos três documentos (classificados por ano crescente, comtitlecomo desempate) para o gêneroHorrorcomn: 3.
Encontre 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:
Utiliza
$matchpara filtrar filmes ondeyearé um número inteiro.Usa
$unwindpara criar um documento separado para cada gênero na arraygenres.Classifica os resultados por
yearem ordem crescente e, em seguida, portitlealfabeticamente.Utiliza
$grouppara agrupar os resultados porgenres.Usa
$lastNpara retornar os últimos três documentos (por ano crescente, comtitlecomo 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 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 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.Classifica os resultados alfabeticamente por
title.Agrupa filmes por
rated(a classificação do conteúdo).Usa a expressão
$condpara retornar filmes3para filmes com classificaçãoPGe filme1para 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.