首页 > 解决方案 > mongodb更改流从时间戳恢复

问题描述

在 mongodb 文档https://docs.mongodb.com/manual/changeStreams/ 中有一句话:

如果时间戳是过去的,oplog 必须有足够的历史来定位与令牌或时间戳关联的操作。

因此,似乎可以恢复并获取从某个时间添加到 oplog 的所有事件。

有一个参数,似乎它必须完成我需要的

watch([],{startAtOperationTime: ...})

https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst#startatoperationtime

参数是时间戳,我不知道如何将特定日期转换为正确的时间戳。

标签: node.jsmongodb

解决方案


startAtOperationTime是 MongoDB 4.0 和更新的驱动程序版本中引入的变更流的新参数。它允许您确保不会丢失任何写入,以防万一流被中断,并且您无权访问恢复令牌。

使用的一个警告startAtOperationTime是,您的应用程序需要准备好接受它可能会在恢复更改流时看到两次写入事件,因为您是从任意时间点恢复。

在节点中,这可以通过构造一个Timestamp 对象并将其传递给watch()来完成:

async function run() {
  const con = await MongoClient.connect(uri, {useNewUrlParser: true})
  const ts = new Timestamp(1, 1560812065)
  con.db('test').collection('test').watch([], {startAtOperationTime: ts})
    .on('change', console.log)
}

对象本身以以下Timestamp形式创建:

new Timestamp(ordinal, unix_epoch_in_seconds)

详细解释可以在BSON Timestamp中找到。

在节点中,您可以使用例如:

(new Date).getTime()

请记住,这需要转换为秒才能创建Timestamp所需的对象startAtOperationTime


推荐阅读