【问题标题】:mongodb change stream resume from timestampmongodb更改流从时间戳恢复
【发布时间】:2019-06-18 09:23:59
【问题描述】:

在 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.js mongodb


【解决方案1】:

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

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

在节点中,这可以通过构造一个Timestamp object并将其传递给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()

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

【讨论】:

  • 这实际上对我不起作用,我没有得到过去的事件,你检查了吗?可能是nodejs驱动的问题(我试过最新版),Mongodb 4.0?
  • 啊,它适用于最新的驱动程序 3.3-beta 版本。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2011-09-05
  • 2015-11-09
  • 2018-11-27
  • 2017-02-19
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多