node.js - mongodb更改流从时间戳恢复
问题描述
在 mongodb 文档https://docs.mongodb.com/manual/changeStreams/ 中有一句话:
如果时间戳是过去的,oplog 必须有足够的历史来定位与令牌或时间戳关联的操作。
因此,似乎可以恢复并获取从某个时间添加到 oplog 的所有事件。
有一个参数,似乎它必须完成我需要的
watch([],{startAtOperationTime: ...})
参数是时间戳,我不知道如何将特定日期转换为正确的时间戳。
解决方案
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
。
推荐阅读
- c - 在结构 C 中锁定 pthread_mutex_t
- javascript - 改变请求动画帧的速度
- mysql - MySQL在列上创建具有条件的表
- python - 如何发送一个固定大小(10 个字节)的 HEADER,它指示要发送和接收的消息的大小(使用 Python 和 pickle)
- python - IOError:[Errno 13] 打开文件时权限被拒绝
- amazon-s3 - 将视频实时流保存到 Amazon S3
- c++ - 从另一个 cpp 文件引用私有向量
- r - 如何获得R中日期间隔的重叠值
- scala - 对intervalJoin感到困惑
- bash - Bash Cluster Monitor - 分配帮助