Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$last (agregação)

Nesta página

  • Definição
  • Sintaxe
  • Comportamentos
  • Exemplos
$last

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:

$last sintaxe:

{ $last: <expression> }
  • 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.

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.

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 retorna null 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.

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") }

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 por state. Existem partições para CA e WA.

  • sortBy: { orderDate: 1 } classifica os documentos em cada partição por orderDate em ordem crescente (1), para que o orderDate mais antigo seja o primeiro.

  • output Definir o campo lastOrderTypeForState como a última ordem type da janela documents.

    O window contém documentos entre o limite inferior current, que é o documento atual na saída, e o limite superior unbounded. Isso significa que $last retorna a última ordem type 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" }

Voltar

$isoWeekYear