使用MongoCollection.FindAll返回相同的文档两次

时间:2014-10-21 12:11:52

标签: mongodb mongodb-query mongodb-.net-driver

由于从MongoDB获取重复文档,我们遇到了系统中的错误。 在同时从另一个进程更新集合时使用FindAll时会发生这种情况。

避免这种情况的最佳做法是什么?

我们不介意获取刚刚更新的文档的陈旧版本,获取刚刚删除的文档,也不会错过刚刚插入的文档。

我们已经看到游标($snapshot: true)有SetSnapshot选项,但性能影响是什么?为什么默认情况下不启用它?

我们可以手动删除返回的重复项,但这看起来并不正确,也会影响性能。


更新

根据我们的理解,更改文档大小的更新可能会移动其在集合中的位置。如果在FindAll操作期间$snapshot选项关闭时发生此类更新,则文档可以返回两次。


更新2:

在客户端(内存中)手动删除重复项不是一种选择,因为某些文档可能会丢失(出于同样的原因,它们可能会出现两次)。

1 个答案:

答案 0 :(得分:1)

为此FAQ entry,基本上可以说明您可以通过以下方式阻止重复的文档出现在您的查询中:

  • 使用$snapshot,但不能与分片集合或sort()
  • 一起使用
  • 对不会更改且具有唯一索引的字段对查询进行排序

因此,如果其限制不会为您造成问题,请使用$snapshot,或者在_id等静态,唯一索引字段对结果进行排序,必要时使用hint()确保它被使用了。使用explain()进行一些分析以测试您的选项。

$snapshot由于其限制,默认情况下未启用。