Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$last (operador de expresión)

$last

Modificado en la versión 5.0.

Devuelve el valor que resulta de aplicar un Expresión al último documento de un grupo. Solo tiene sentido cuando los documentos están en un orden definido.

$last está disponible en estas etapas:

Nota

Desambiguación

Esta página describe el $last acumulador de agregación. Para el operador de $last matriz,$last (array operator) consulte.

$last sintaxis:

{ $last: <expression> }

Para obtener más información sobre las expresiones, consulta Expresiones.

Para definir el orden del documento para $last con:

Nota

Aunque la etapa pasa documentos $sort $group $setWindowFields ordenados como entrada a las etapas y, no se garantiza que dichas etapas mantengan el orden de clasificación en su propia salida.

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

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 item por date y, y luego, en la siguiente etapa,$group agrupa los documentos ahora ordenados por el item campo y utiliza el acumulador para calcular la última fecha de venta de cada $last 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 para generar el último pedido de venta de $setWindowFields pasteles type para state cada:

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 lastOrderTypeForState campo en el último pedido type de la ventana de documentos.

    La ventana contiene documentos entre el current límite inferior, que corresponde al documento actual en la salida, y el unbounded límite superior. Esto significa que devuelve el último $last 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

$isoWeekYear

En esta página