在mongodb文档https://docs.mongodb.com/manual/changeStreams/中 有一个报价:
如果时间戳记已过去,则oplog必须具有足够的历史记录来定位与令牌或时间戳记关联的操作。
因此似乎可以恢复并从特定时间获取添加到oplog中的所有事件。
有一个参数,似乎它必须完成我需要的
watch([],{startAtOperationTime: ...})
Param是时间戳记,我不知道如何转换特定日期以纠正时间戳记。
答案 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
对象需要将其转换为秒。