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