Docs Menu
Docs Home
/ /

$last (operador de expresión)

$last

Modificado en la versión 5.0.

Devuelve el resultado de una Expresión para el último documento de un grupo. Solo tiene sentido cuando los documentos están en un orden definido.

$last está disponible en estas etapas:

$last sintaxis:

{ $last: <expression> }
  • Para definir el orden de los documentos para $last en $setWindowFields, establece el campo sortBy.

  • Para definir el orden de los documentos para $last en otras etapas de pipeline, se añade una etapa $sort anterior.

Si la expresión se resuelve en un arreglo:

  • Para un grupo de documentos, al igual que en las etapas $group $setWindowFields y, $last devuelve la matriz completa desde el último documento. No recorre los elementos de la matriz.

  • Para un documento individual, como en la $addFields etapa, $last devuelve el último elemento de la matriz.

En los documentos de un grupo pueden faltar campos o pueden tener campos a los que les faltan valores.

  • Si no hay documentos de la etapa de pipeline anterior, la etapa $group no devuelve nada.

  • Si falta el campo en procesamiento por parte del acumulador de $last, $last devuelve null.

  • Cuando se usa con $setWindowFields, $last devuelve null para ventanas vacías. Por ejemplo, cuando se tiene una ventana { documents: [ -1, -1] } documents en el primer documento de una partición.

Para obtener más información, consulte el ejemplo de datos faltantes más adelante en este tema.

Considera una colección sales con los siguientes 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 }
] )

La siguiente operación primero ordena los documentos por item y date, y luego, en la siguiente etapa $group, agrupa los documentos ahora ordenados por el campo item y utiliza el acumulador $last para calcular la última fecha de venta de cada artículo:

db.sales.aggregate(
[
{ $sort: { item: 1, date: 1 } },
{
$group:
{
_id: "$item",
lastSalesDate: { $last: "$date" }
}
}
]
)

La operación devuelve los siguientes 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") }

Nuevo en la versión 5.0.

Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y 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 ejemplo utiliza $last en la etapa $setWindowFields para generar el último pedido de venta de pasteles type para cada state:

db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { orderDate: 1 },
output: {
lastOrderTypeForState: {
$last: "$type",
window: {
documents: [ "current", "unbounded" ]
}
}
}
}
}
] )

En el ejemplo:

  • partitionBy: "$state" particiona los documentos de la colección en state. Existen particiones para CA y WA.

  • sortBy: { orderDate: 1 } ordena los documentos de cada partición por orderDate en orden ascendente (1), de modo que el orderDate más antiguo sea el primero.

  • output Establece el campo lastOrderTypeForState en el último pedido type de la ventana documents.

    El window contiene documentos entre el límite inferior current, que corresponde al documento actual en la salida, y el límite superior unbounded. Esto significa que $last devuelve el último orden type para los documentos entre el documento actual y el final de la partición.

En esta salida, el último valor de orden type para CA y WA se muestra en el 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" }

Volver

$firstN

En esta página