Definición
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:
$setWindowFields(Disponible a partir de MongoDB 5.0)
Sintaxis
$last sintaxis:
{ $last: <expression> }
Comportamientos
Definir el orden de documentos
Operador de arreglos
Si la expresión se resuelve en un arreglo:
Para un grupo de documentos, al igual que en las etapas
$group$setWindowFieldsy,$lastdevuelve la matriz completa desde el último documento. No recorre los elementos de la matriz.Para un documento individual, como en la
$addFieldsetapa,$lastdevuelve el último elemento de la matriz.
Valores ausentes
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
$groupno devuelve nada.Si falta el campo en procesamiento por parte del acumulador de
$last,$lastdevuelvenull.Cuando se usa con
$setWindowFields,$lastdevuelvenullpara ventanas vacías. Por ejemplo, cuando se tiene una ventana{ documents: [ -1, -1] }documentsen 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.
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 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") }
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 $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 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 el campolastOrderTypeForStateen el último pedidotypede la ventanadocuments.El
windowcontiene documentos entre el límite inferiorcurrent, que corresponde al documento actual en la salida, y el límite superiorunbounded. Esto significa que$lastdevuelve el último ordentypepara 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" }