我有一些代码检查 Mongo 集合中的每个对象(在没有参数的情况下迭代 find() 的结果),并对其中的一些进行更改。这似乎不是一件安全的事情:我的更改已保存,但是当我继续遍历光标时,更改对象的子集(10-15%)再次出现。我没有更改文档 ID 或任何有索引的东西。
我想我可以通过提前获取所有文档 ID(将光标转换为数组)来避免这个问题,但这些都是大型集合,所以我真的很想避免这种情况。
我注意到默认情况下 find() 的结果似乎没有任何定义的顺序,因此我尝试在光标 {"_id":1} 上进行显式排序。这似乎已经解决了这个问题——无论我修改什么,现在都没有出现两次。但我不知道这是否是一个好的/可靠的方法。据我从文档中可以看出,添加排序不会 使其预查询所有 ID;如果是这样,那很好,但我不知道为什么它会解决问题。
在更改内容时使用光标只是一个坏主意吗?
我正在使用 Scala/Casbah,如果这很重要的话。
最佳答案
听起来您想要的是快照查询。以下是有关如何执行此操作的更多信息:
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
关于mongodb - 迭代游标时修改Mongo对象的安全+有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199089/