Definición
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:
$setWindowFields(Disponible a partir de MongoDB 5.0)
Nota
Desambiguación
Esta página describe el $last acumulador de agregación. Para el operador de $last matriz,$last (array
operator) consulte.
Sintaxis
$last sintaxis:
{ $last: <expression> }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Para definir el orden del documento para $last con:
$groupEtapa, agregue una etapa$sort$groupantes de la etapa.$setWindowFieldsEtapa, establezca el campo sortBy.
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.
Ejemplos
Usar en la etapa $group
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") }
Usar en la etapa $setWindowFields
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 enstate. Existen particiones paraCAyWA.sortBy: { orderDate: 1 }ordena los documentos de cada partición pororderDateen orden ascendente (1), de modo que elorderDatemás antiguo sea el primero.
outputEstablece ellastOrderTypeForStatecampo en el último pedidotypede la ventana de documentos.La ventana contiene documentos entre el
currentlímite inferior, que corresponde al documento actual en la salida, y elunboundedlímite superior. Esto significa que devuelve el último$lastordentypepara 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" }