Definição
Retorna o resultado de uma expressão para o último documento em um grupo de documentos. Só faz sentido quando os documentos estão em uma ordem definida.
O acumulador $last está disponível nestes estágios:
Observação
Desambiguação
Esta página descreve $last quando usado como um acumulador. Acumuladores retornam um único valor agregado, como soma, máximo ou mínimo, em um grupo de documentos de entrada.
Você também pode usar $last nestes outros contextos:
$last (expression), que retorna o último elemento de um array.$last (window function), usado no estágio$setWindowFieldspara retornar um valor para o último documento em uma janela.
Sintaxe
{ $last: <expression> }
Comportamento
Definir ordem do documento
Para definir a ordem do documento para $last em um estágio de agrupamento, adicione um estágio $sort anterior.
Valores em falta
Documentos em um grupo podem estar sem campos. $last lida com valores ausentes da seguinte forma:
Se não houver documentos do estágio anterior do pipeline, o estágio
$groupnão retornará nada.Quando o
expressionpara o último documento do grupo avalia como um valor ausente,$lastretornanull.
Por exemplo, considere os seguintes documentos na coleção badData, onde alguns documentos estão com campos ausentes:
db.badData.insertMany( [ { "_id": 1, "price": 6, "quantity": 6 }, { "_id": 2, "item": "album", "price": 5, "quantity": 5 }, { "_id": 7, "item": "tape", "price": 6, "quantity": 6 }, { "_id": 8, "price": 5, "quantity": 5 }, { "_id": 9, "item": "album", "price": 3, "quantity": '' }, { "_id": 10, "item": "tape", "price": 3, "quantity": 4 }, { "_id": 12, "item": "cd", "price": 7 } ] )
Consulte a coleção badData, agrupando a saída no campo item:
db.badData.aggregate( [ { $sort: { item: 1, price: 1 } }, { $group: { _id: "$item", inStock: { $last: "$quantity" } } } ] )
$last seleciona o último documento de cada grupo de saída. Documentos que não têm o campo item são agrupados com um valor null para o campo _id. Quando o campo acumulador está ausente (quantity neste exemplo), $last retorna null.
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.
O exemplo a seguir classifica filmes por ano e título e, em seguida, os agrupa por gênero para encontrar o filme mais recente lançado em cada gênero:
db.movies.aggregate( [ { $match: { year: { $type: "int" } } }, { $sort: { year: 1, title: 1 } }, { $unwind: "$genres" }, { $group: { _id: "$genres", lastMovieTitle: { $last: "$title" }, lastMovieYear: { $last: "$year" } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
No pipeline anterior:
$matchfiltro para filmes com um campoyearinteiro. Isso elimina dados incorretos ondeyearestá ausente ou não é um número.$sortordena filmes poryearem ordem crescente, depoistitleem ordem alfabética.$unwindcria um documento separado para cada gênero no arraygenres, mantendo a ordem de classificação estabelecida anteriormente.$groupcom$lastretorna otitlee oyeardo último filme (mais recente por ano e alfabeticamente último por título) para cada gênero.Um segundo
$sortclassifica os resultados em ordem alfabética por gênero.$limitrestringe a saída a 5 gêneros.