$last (agregação)
Nesta página
Definição
Alterado na versão 5.0.
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.
$last
está disponível nestes estágios:
$setWindowFields
(Disponível a partir do MongoDB 5.0)
Sintaxe
$last
sintaxe:
{ $last: <expression> }
Comportamentos
Definindo ordem do documento
Para definir a ordem do documento para
$last
em um$setWindowFields
, defina o campo Classificar por.Para definir a ordem do documento para
$last
em outros estágios do pipeline, adicione um estágio$sort
anterior.
Operador de array
Se a expressão resolver para uma array:
Para um grupo de documentos, como nos estágios
$group
e$setWindowFields
,$last
retorna a array inteira do último documento. Ele não atravessa os elementos da array.Para um documento individual, como com a etapa
$addFields
, o$last
retorna o último elemento da array.
Valores em falta
Documentos em um grupo podem estar sem campos ou podem ter campos com valores ausentes.
Se não houver documentos do estágio anterior do pipeline, o estágio
$group
não retornará nada.Se o campo que o acumulador do
$last
está em processamento estiver ausente, o$last
retornaránull
.Quando utilizado com
$setWindowFields
, o$last
retornanull
para janelas vazias. Por exemplo, quando você tem uma janela{ documents: [ -1, -1] }
documents
no primeiro documento de uma partição.
Para obter mais informações, consulte o exemplo de dados ausentes mais adiante neste tópico.
Exemplos
Uso no $group
estágio
Considere uma collection sales
com os seguintes documentos:
{ "_id" : 1, "item" : "abc", "date" : ISODate("2014-01-01T08:00:00Z"), "price" : 10, "quantity" : 2 } { "_id" : 2, "item" : "jkl", "date" : ISODate("2014-02-03T09:00:00Z"), "price" : 20, "quantity" : 1 } { "_id" : 3, "item" : "xyz", "date" : ISODate("2014-02-03T09:05:00Z"), "price" : 5, "quantity" : 5 } { "_id" : 4, "item" : "abc", "date" : ISODate("2014-02-15T08:00:00Z"), "price" : 10, "quantity" : 10 } { "_id" : 5, "item" : "xyz", "date" : ISODate("2014-02-15T09:05:00Z"), "price" : 5, "quantity" : 10 } { "_id" : 6, "item" : "xyz", "date" : ISODate("2014-02-15T12:05:10Z"), "price" : 5, "quantity" : 5 } { "_id" : 7, "item" : "xyz", "date" : ISODate("2014-02-15T14:12:12Z"), "price" : 5, "quantity" : 10 }
A operação a seguir primeiro classifica os documentos por item
e date
e, no estágio seguinte $group
, agrupa os documentos agora classificados pelo campo item
e usa o acumulador $last
para calcular a última data de venda de cada item:
db.sales.aggregate( [ { $sort: { item: 1, date: 1 } }, { $group: { _id: "$item", lastSalesDate: { $last: "$date" } } } ] )
A operação retorna os seguintes resultados:
{ "_id" : "xyz", "lastSalesDate" : ISODate("2014-02-15T14:12:12Z") } { "_id" : "jkl", "lastSalesDate" : ISODate("2014-02-03T09:00:00Z") } { "_id" : "abc", "lastSalesDate" : ISODate("2014-02-15T08:00:00Z") }
Uso no $setWindowFields
estágio
Novidades na versão 5.0.
Crie uma collection cakeSales
que contenha vendas de bolo nos estados da Califórnia (CA
) e de Washington (WA
):
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
Este exemplo usa $last
no estágio $setWindowFields
para produzir o último pedido de venda de bolo type
para cada state
:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { lastOrderTypeForState: { $last: "$type", window: { documents: [ "current", "unbounded" ] } } } } } ] )
No exemplo:
partitionBy: "$state"
particiona os documentos na collection porstate
. Existem partições paraCA
eWA
.sortBy: { orderDate: 1 }
classifica os documentos em cada partição pororderDate
em ordem crescente (1
), para que oorderDate
mais antigo seja o primeiro.
output
Definir o campolastOrderTypeForState
como a última ordemtype
da janeladocuments
.O
window
contém documentos entre o limite inferiorcurrent
, que é o documento atual na saída, e o limite superiorunbounded
. Isso significa que$last
retorna a última ordemtype
para os documentos entre o documento atual e o final da partição.
Nessa saída, o valor type
da última ordem para CA
e WA
é mostrado no campo lastOrderTypeForState
:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "lastOrderTypeForState" : "vanilla" } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "lastOrderTypeForState" : "vanilla" } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "lastOrderTypeForState" : "vanilla" } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "lastOrderTypeForState" : "chocolate" } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "lastOrderTypeForState" : "chocolate" } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "lastOrderTypeForState" : "chocolate" }