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 nos seguintes estágios:
Observação
Desambiguação
Esta página descreve $last quando usado como acumulador. Os 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 uma 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
expressiondo último documento no grupo avalia para um valor ausente,$lastretornanull.
Por exemplo, considere os seguintes documentos na collection badData, onde alguns documentos não têm campos:
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. Os documentos que não possuem 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 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.
O exemplo a seguir classifica os 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:
$matchfiltros para filmes com um campoyearinteiro. Isso elimina dados incorretos em queyearestá ausente ou não é um número.$sortordena filmes poryearem ordem crescente e, em seguida,titleem ordem alfabética.$unwindcria um documento separado para cada gênero na arraygenres, mantendo a ordem de classificação estabelecida anteriormente.$groupcom$lastretornatitleeyeardo último filme (mais recente por ano e alfabeticamente por último por título) para cada gênero.Um segundo
$sortclassifica os resultados alfabeticamente por gênero.$limitrestringe a saída a gêneros 5.