$last (aggregation accumulator)

On this page本页内容

Definition定义

$last

Changed in version 5.0.在版本5.0中更改

Returns the value that results from applying an expression to the last document in a group of documents. 返回将表达式应用于一组文档中的最后一个文档时产生的值。Only meaningful when documents are in a defined order.仅当文档处于定义的顺序时才有意义。

$last is available in these stages:可在以下阶段使用:

Note注意
Disambiguation消除歧义

This page describes the $last aggregation accumulator. 此页面介绍$last聚合累加器。For the $last array operator, see $last (array operator).有关$last数组运算符,请参阅$last(数组运算符)

Syntax语法

$last syntax:语法:

{ $last: <expression> }

For more information on expressions, see Expressions.有关表达式的详细信息,请参阅表达式

Behavior行为

To define the document order for $last with the:要使用定义$last的文档顺序:

Note注意

Although the $sort stage passes ordered documents as input to the $group and $setWindowFields stages, those stages are not guaranteed to maintain the sort order in their own output.尽管$sort阶段将有序文档作为输入传递给$group$setWindowFields阶段,但这些阶段不能保证在自己的输出中维护排序顺序。

When used with $setWindowFields, $last returns null for empty windows. $setWindowFields一起使用时,对于空窗口$last返回nullAn example empty window is a { documents: [ -1, -1 ] } documents window on the first document of a partition.空窗口的示例是分区第一个文档上的{ documents: [ -1, -1 ] }文档窗口。

Examples示例

Use in $group Stage$group阶段中使用

Consider a sales collection with the following documents:考虑使用以下文档进行sales集合:

{ "_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 }

The following operation first sorts the documents by item and date, and then in the following $group stage, groups the now sorted documents by the item field and uses the $last accumulator to compute the last sales date for each item:以下操作首先按itemdate对文档进行排序,然后在下面的$group阶段中,按项目字段对现在排序的文档进行分组,并使用$last累加器计算每个项目的最后销售日期:

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

The operation returns the following results:该操作返回以下结果:

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

Use in $setWindowFields Stage$setWindowFields阶段中使用

New in version 5.0.在版本5.0中新增

Create a cakeSales collection that contains cake sales in the states of California (CA) and Washington (WA):创建包含加利福尼亚州(CA)和华盛顿州(WA)蛋糕销售的cakeSales集合:

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

This example uses $last in the $setWindowFields stage to output the last cake sales order type for each state:本例使用$setWindowFields阶段中的$last输出每个州的最后一个蛋糕销售订单type

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

In the example:在示例中:

  • partitionBy: "$state" partitions the documents in the collection by state. state对集合中的文档进行分区There are partitions for CA and WA.CAWA分区。
  • sortBy: { orderDate: 1 } sorts the documents in each partition by orderDate in ascending order (1), so the earliest orderDate is first.orderDate以升序(1)对每个分区中的文档进行排序,因此最早的orderDate居第一。
  • output sets the lastOrderTypeForState field to the last order type from the documents window.lastOrderTypeForState字段设置为文档窗口中的最后一个订单type

    The window contains documents between the current lower limit, which is the current document in the output, and the unbounded upper limit. 窗口包含current下限(即输出中的当前文档)和unbounded上限之间的文档。This means $last returns the last order type for the documents between the current document and the end of the partition.这意味着$last返回当前文档和分区末尾之间文档的最后一个订单类型。

In this output, the last order type value for CA and WA is shown in the lastOrderTypeForState field:在此输出中,CAWA的最后一个订单type值显示在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" }
←  $isoWeekYear (aggregation)$lastN (aggregation accumulator) →