Мы столкнулись с ошибкой в нашей системе, вызванной получением дубликатов документов из MongoDB. Это происходит при использовании FindAll
при одновременном обновлении коллекции из другого процесса.Использование MongoCollection.FindAll дважды возвращает тот же документ
Какова наилучшая практика, чтобы этого избежать?
Мы не против получения устаревшей версии только что обновленного документа, получения только что удаленных документов или отсутствующих только вставленных документов.
Мы видели, что существует опция SetSnapshot
для курсоров ($snapshot: true
), но каковы последствия для производительности? Почему он не включен по умолчанию?
Мы можем удалить возвращенные дубликаты вручную, но это не похоже на правду, а также будет хитом производительности.
Update:
От нашего понимания, обновления, которые изменяют размер документа может переместить его местоположение в коллекции. Если такой тип обновления происходит во время операции FindAll
, когда опция $snapshot
выключена, документ может быть возвращен дважды.
Update 2:
Удаление дубликатов вручную на стороне клиента (в памяти) не вариант, так как некоторые документы могут быть утеряны (по тем же причинам, они могут появляться в два раза).
Спасибо, мы видели этот FAQ, но это путь? Может ли это вызвать больше поисков, чем поиск без запроса? И если это так, было бы лучше удалить дубликаты в памяти после поиска? –
Да, это путь. Удаление дубликатов на стороне клиента, скорее всего, будет медленнее и определенно беспорядочно. – JohnnyHK
Удаление дубликатов с клиентской стороны отключено. Некоторые существующие документы могут вообще не возвращаться. Знаете ли вы, имеет ли параметр «$ snapshot» отрицательные эффекты? Еще раз спасибо за помощь :) –