MongoDB聚合运算符:$tsIncrement

MongoDB聚合运算符:$tsIncrement

文章目录

  • [MongoDB聚合运算符:tsIncrement](#MongoDB聚合运算符:tsIncrement)

$tsIncrement用来以 long形式返回时间戳的递增序数。当同一秒内发生多个事件时,递增序数唯一标识每个事件。

语法

js 复制代码
{ $tsIncrement: <expression> }
  • <expression>表达式必须能解析为时间戳。

使用

  • 如果输入表达式的值为null或引用的字段缺失,则$tsIncrement返回null
  • 如果输入表达式的值不是时间戳,则返回错误。

举例

从时间戳字段获取递增序数

使用下面的脚本创建stockSales集合,包含公司股票金融市场销售的情况:

js 复制代码
db.stockSales.insertMany( [
   { _id: 0, symbol: "MDB", saleTimestamp: Timestamp(1622731060, 1) },
   { _id: 1, symbol: "MDB", saleTimestamp: Timestamp(1622731060, 2) },
   { _id: 2, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 1) },
   { _id: 3, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 2) },
   { _id: 4, symbol: "MSFT", saleTimestamp: Timestamp(1714124193, 3) }
] )

下面的聚合操作使用$tsIncrement表达式计算角度angle的双曲正切值,然后使用$addFields管道阶段将其添加到输入文档。

js 复制代码
db.trigonometry.aggregate( [
   {
      $addFields : {
         "tanh_output" : { $tsIncrement : { $degreesToRadians : "$angle" } }
      }
   }
] )

在时间戳构造函数中:

  • 第一个值是 Unix 纪元之后的秒数。
  • 第二个值是递增序号。当同一秒内发生多个事件时,递增序号将唯一标识每个事件。

下面的示例在 $project 阶段使用 $tsIncrement 从股票销售 salesTimestamp 字段返回递增序号:

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

在示例中,$project 只包括 saleTimestamp 和 saleIncrement 字段,如下输出所示:

js 复制代码
{
  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")
}

在变化的数据流游标中使用 $tsIncrement 来监控集合变化

下面的示例在变化数据流游标中使用了$tsIncrement,返回在同一秒钟内对集合所做的每一次更改。

cakeSales集合上创建一个变化流游标:

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

在本例中:

  • db.collection.watch()方法为cakeSales集合创建一个变化流游标,并将该游标存储在cakeSalesCursor中。
  • $match阶段使用$expr运算符对文档进行过滤。
  • $expr 运算符:
    • $mod 2应用于由$tsIncrement返回的$clusterTime变量的递增序号。
    • $clusterTime为修改cakeSales集合时来自oplog条目的时间戳。
    • 使用 $eq$mod返回值与0比较。

创建一个cakeSales集合,其中包含加利福尼亚州 (CA) 和华盛顿州 (WA) 的蛋糕销售情况:

js 复制代码
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 }
] )

可以使用cakeSalesCursor来监视cakeSales集合的更改,例如,使用 next()方法获取cakeSalesCursor的下一个文档:

js 复制代码
cakeSalesCursor.next()

根据文档添加到cakeSales的秒数不同,cakeSalesCursor.next()的输出也不同,例如,文档添加时间可能超过一秒。

下面的cakeSalesCursor.next()输出示例显示了添加到 cakeSales 集合的第一个文档的插入详细信息。注意,在 clusterTime 字段中,递增序号 i2

js 复制代码
_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 }

再次运行 cakeSalesCursor.next(),返回clusterTime递增序号 i4cakeSales 文档,忽略 i3 的文档。

相关推荐
南城花随雪。3 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了4 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度6 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮8 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...2 小时前
索引(MySQL)
数据库·mysql·索引
菠萝咕噜肉i2 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁