mongodb更改流从时间戳恢复

时间:2019-06-12 14:42:10

标签: node.js 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

Param是时间戳记,我不知道如何转换特定日期以纠正时间戳记。

1 个答案:

答案 0 :(得分:1)

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

使用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()

请记住,创建Timestamp所需的startAtOperationTime对象需要将其转换为秒。