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
$lastem um$setWindowFields, defina o campo Classificar por.Para definir a ordem do documento para
$lastem outros estágios do pipeline, adicione um estágio$sortanterior.
Operador de array
Se a expressão resolver para uma array:
Para um grupo de documentos, como nos estágios
$groupe$setWindowFields,$lastretorna a array inteira do último documento. Ele não atravessa os elementos da array.Para um documento individual, como com a etapa
$addFields, o$lastretorna 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
$groupnão retornará nada.Se o campo que o acumulador do
$lastestá em processamento estiver ausente, o$lastretornaránull.Quando utilizado com
$setWindowFields, o$lastretornanullpara janelas vazias. Por exemplo, quando você tem uma janela{ documents: [ -1, -1] }documentsno primeiro documento de uma partição.
Para obter mais informações, consulte o exemplo de dados ausentes mais adiante neste tópico.
Exemplos
Usar no estágio $group
Considere uma collection sales com os seguintes documentos:
db.sales.insertMany( [ { _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") }
Usar no estágio $setWindowFields
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 paraCAeWA.sortBy: { orderDate: 1 }classifica os documentos em cada partição pororderDateem ordem crescente (1), para que oorderDatemais antigo seja o primeiro.
outputDefinir o campolastOrderTypeForStatecomo a última ordemtypeda janeladocuments.O
windowcontém documentos entre o limite inferiorcurrent, que é o documento atual na saída, e o limite superiorunbounded. Isso significa que$lastretorna a última ordemtypepara 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" }