$tsIncrement (aggregation)

On this page本页内容

Definition定义

$tsIncrement

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

Returns the incrementing ordinal from a timestamp as a long.long形式返回时间戳中递增的序号。

When multiple events happen within the same second, the incrementing ordinal uniquely identifies each event.当多个事件在同一秒内发生时,递增序号唯一标识每个事件。

$tsIncrement syntax:语法

{ $tsIncrement: <expression> }

The expression must resolve to a timestamp.表达式必须解析为timestamp

Tip提示
See also: 参阅:

Behavior行为

$tsIncrement returns:返回:

  • Null if the input expression evaluates to null or refers to a field that is missing.如果输入表达式的计算结果为Null或引用缺少的字段,则为Null
  • An error if the input expression does not evaluate to a timestamp.如果输入表达式的计算结果不是timestamp,则为错误。

Examples示例

Obtain the Incrementing Ordinal from a Timestamp Field从时间戳字段获取递增序号

Create a stockSales collection that contains company stock financial market sales:创建包含公司股票金融市场销售额的stockSales集合:

db.stockSales.insertMany( [
   { _id: 0, symbol: "ABC", saleTimestamp: Timestamp(1622731060, 1) },
   { _id: 1, symbol: "ABC", saleTimestamp: Timestamp(1622731060, 2) },
   { _id: 2, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 1) },
   { _id: 3, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 2) },
   { _id: 4, symbol: "DEF", saleTimestamp: Timestamp(1714124193, 3) }
] )

In the timestamp constructor, the:timestamp构造函数中

  • First value is the number of seconds after the Unix epoch.第一个值是Unix历元后的秒数。
  • Second value is the incrementing ordinal. 第二个值是递增序数。When multiple events happen within the same second, the incrementing ordinal uniquely identifies each event.当多个事件在同一秒内发生时,递增序号唯一标识每个事件。

The following example uses $tsIncrement in a $project stage to return the incrementing ordinal from the stock sales saleTimestamp field:以下示例在$project阶段中使用$tsIncrement从股票销售时间戳saleTimestamp字段返回递增序号:

db.stockSales.aggregate( [
   {
      $project:
      {
         _id: 0, saleTimestamp: 1, saleIncrement: { $tsIncrement: "$saleTimestamp" }
      }
   }
] )

In the example, $project only includes the saleTimestamp and saleIncrement fields as shown in the following output:在本例中,$project仅包含saleTimestampsaleIncrement字段,如以下输出所示:

{
  saleTimestamp: Timestamp({ t: 1622731060, i: 1 }),
  saleIncrement: Long("1")
},
{
  saleTimestamp: Timestamp({ t: 1622731060, i: 2 }),
  saleIncrement: Long("2")
},
{
  saleTimestamp: Timestamp({ t: 1714124193, i: 1 }),
  saleIncrement: Long("1")
},
{
  saleTimestamp: Timestamp({ t: 1714124193, i: 2 }),
  saleIncrement: Long("2")
},
{
  saleTimestamp: Timestamp({ t: 1714124193, i: 3 }),
  saleIncrement: Long("3")
}

Use $tsIncrement in a Change Stream Cursor to Monitor Collection Changes在更改流游标中使用$tsIncrement监视集合更改

The example in this section uses $tsIncrement in a change stream cursor to return every other change made to a collection in the same second of time.本节中的示例在更改流游标中使用$tsIncrement来返回在同一时间内对集合所做的所有其他更改。

Create a change stream cursor on a collection named cakeSales that you will see later in this section:在一个名为cakeSales的集合上创建一个变更流游标,您将在本节后面看到:

cakeSalesCursor = db.cakeSales.watch( [
   {
      $match: {
         $expr: {
            $eq: [
               { $mod: [ { $tsIncrement: "$clusterTime" } , 2 ] },
               0
            ]
         }
      }
   }
] )

In the example, the:在该示例中:

  • db.collection.watch() method creates a change stream cursor for the cakeSales collection and stores the cursor in cakeSalesCursor.方法为cakeSales集合创建更改流游标,并将游标存储在cakeSalesCursor中。
  • $match stage filters the documents to those returned by the $expr operator.阶段将文档筛选为$expr运算符返回的文档。
  • $expr operator:运算符:

    • Applies $mod 2 to the $clusterTime variable's incrementing ordinal returned by $tsIncrement.$mod 2应用于$tsIncrement返回的$clusterTime变量的递增序号。

      $clusterTime is the timestamp from the oplog entry when the cakeSales collection is modified. 是修改cakeSales集合时oplog条目的时间戳。See Command Response.请参阅命令响应

    • Compares the returned value from $mod to 0 using $eq.使用$eq$mod返回的值与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 }
] )

To monitor the cakeSales collection changes, use cakeSalesCursor. 要监视cakeSales集合更改,请使用cakeSalesCursorFor example, to obtain the next document from cakeSalesCursor, use the next() method:例如,要从cakeSalesCursor获取下一个文档,请使用next()方法:

cakeSalesCursor.next()

Depending on the second when the documents were added to cakeSales, the output from cakeSalesCursor.next() varies. 根据文档添加到cakeSales的秒数,cakeSalesCursor.next()的输出会有所不同。For example, the document additions might span more than one second.例如,文档添加可能会持续一秒钟以上。

The following cakeSalesCursor.next() example output shows the insert details for the first document added to the cakeSales collection. 以下cakeSalesCursor.next()示例输出显示了添加到cakeSales集合的第一个文档的insert详细信息。Notice the incrementing ordinal i is 2 in the clusterTime field.请注意,clusterTime字段中递增序号i2

_id: {
  _data: '82613A4F25000000022B022C0100296E5A100454C5BFAF538C47AB950614F43889BE00461E5F696400290004'
},
operationType: 'insert',
clusterTime: Timestamp({ t: 1631211301, i: 2 }),
fullDocument: {
  _id: 0,
  type: 'chocolate',
  orderDate: ISODate("2020-05-18T14:10:30.000Z"),
  state: 'CA',
  price: 13,
  quantity: 120
},
ns: { db: 'test', coll: 'cakeSales' },
documentKey: { _id: 0 }

Running cakeSalesCursor.next() again returns the cakeSales document for which the clusterTime incrementing ordinal i is 4, omitting the document where i is 3.再次运行cakeSalesCursor.next()将返回clusterTime递增序号i4cakeSales文档,忽略i3的文档。

←  $toUpper (aggregation)$tsSecond (aggregation) →