mongodb - 如何通过在不断更新的大集合中迭代游标来避免 mongo 返回重复的文档?

标签 mongodb

上下文

我有一个包含数百万文档的大集合,这些文档会随着生产工作量而不断更新。在执行查询时,我注意到一个文档可以多次返回;我的工作负载尝试将文档迁移到 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/

相关文章:

reactjs - Jest 找不到 MONGO_URI 的 .env.local

node.js - 如果我使用 send 或 json, Node 应用程序崩溃

mongodb - 查找任何字段与搜索字符串匹配的文档

javascript - 使用gridFS在mongoDB中存储文件(图像)

node.js - Mongoose find({}) 不返回任何内容

mongodb - 如何在mongoDB中加入数据库并获取所需结果

java - Morphia 0.110 找不到带有字符串 id 的引用

MongoDB $group 和 $project

Node.js/MongoDB 限制返回更多记录

javascript - 根据数组索引对查询结果进行排序