上下文
我有一个包含数百万文档的大集合,这些文档会随着生产工作量而不断更新。在执行查询时,我注意到一个文档可以多次返回;我的工作负载尝试将文档迁移到 SQL 系统,该系统设置为允许唯一的行 ID,因此崩溃了。
问题
因为集合太大,并且很多用户在查询开始后更新它,所以迭代游标的结果可能会给我具有相同 id 的文档(旧版本和更新版本)。
我尝试过的
const cursor = db.collection.find(query, {snapshot: true});
while (cursor.hasNext()) {
const doc = cursor.next();
// do some stuff
}
根据 mongo 驱动程序的旧文档(我使用的是 nodejs,但这适用于任何官方 mongodb 驱动程序),有一个名为 snapshot
的选项,据说可以避免发生以下情况我。遗憾的是,驱动程序返回一个错误,表明此选项不存在(已弃用)。
问题
有没有一种方法可以安全地迭代集合的文档,这样我就不会两次获得相同的文档?
我只看到一个带有聚合管道的可行选项,但我想探索带有标准查询的其他选项。
最佳答案
终于我从mongo changelog page得到了答案:
MongoDB 3.6.1 弃用了快照查询选项。
对于 MMAPv1,请在 { _id: 1} 索引上使用hint(),以防止游标在干预写入操作导致文档移动时多次返回文档。
对于其他存储引擎,请使用hint() 和 { $natural : 1 } 代替。
所以,从我的代码示例来看:
const cursor = db.collection.find(query).hint({$natural: 1});
while (cursor.hasNext()) {
const doc = cursor.next();
// do some stuff
}
关于mongodb - 如何通过在不断更新的大集合中迭代游标来避免 mongo 返回重复的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67269026/