2014-10-21 1 views
2

Мы столкнулись с ошибкой в ​​нашей системе, вызванной получением дубликатов документов из MongoDB. Это происходит при использовании FindAll при одновременном обновлении коллекции из другого процесса.Использование MongoCollection.FindAll дважды возвращает тот же документ

Какова наилучшая практика, чтобы этого избежать?

Мы не против получения устаревшей версии только что обновленного документа, получения только что удаленных документов или отсутствующих только вставленных документов.

Мы видели, что существует опция SetSnapshot для курсоров ($snapshot: true), но каковы последствия для производительности? Почему он не включен по умолчанию?

Мы можем удалить возвращенные дубликаты вручную, но это не похоже на правду, а также будет хитом производительности.


Update:

От нашего понимания, обновления, которые изменяют размер документа может переместить его местоположение в коллекции. Если такой тип обновления происходит во время операции FindAll, когда опция $snapshot выключена, документ может быть возвращен дважды.


Update 2:

Удаление дубликатов вручную на стороне клиента (в памяти) не вариант, так как некоторые документы могут быть утеряны (по тем же причинам, они могут появляться в два раза).

ответ

1

Там в FAQ entry для этого, которое в основном говорит, что вы можете предотвратить повторяющиеся документы, появляющиеся в вашем запросе либо:

  • Использование $snapshot, но это не может быть использована с sharded коллекций или sort()
  • Сортировка ваш запрос в поле, которое не изменяется и имеет уникальный индекс

Таким образом, используйте $snapshot, если его ограничения не создают для вас проблем или сортируют результаты o n статическое поле с уникальным индексом, например _id, используя hint(), если необходимо, чтобы убедиться, что оно используется. Сделайте некоторые профилирования с помощью explain(), чтобы проверить свои варианты.

$snapshot не включен по умолчанию из-за его ограничений.

+0

Спасибо, мы видели этот FAQ, но это путь? Может ли это вызвать больше поисков, чем поиск без запроса? И если это так, было бы лучше удалить дубликаты в памяти после поиска? –

+0

Да, это путь. Удаление дубликатов на стороне клиента, скорее всего, будет медленнее и определенно беспорядочно. – JohnnyHK

+0

Удаление дубликатов с клиентской стороны отключено. Некоторые существующие документы могут вообще не возвращаться. Знаете ли вы, имеет ли параметр «$ snapshot» отрицательные эффекты? Еще раз спасибо за помощь :) –