Подтвердить что ты не робот

Разрешение конфликтов репликации для удаленных документов в CouchDB

Способом разрешения конфликтов репликации, рекомендованных официальной документацией, является:

  • Прочитайте конфликтующие версии с использованием поля document _conflicts (например, через представление)
  • Получить документы для всех перечисленных изменений
  • Выполнение слияния приложений
  • Удаление нежелательных изменений

Проблема возникает, когда я хочу объединить удаленные документы. Они не отображаются в поле _conflicts, но в _deleted_conflicts. Если я объединю только поле _conflicts, и документ будет удален в локальной базе данных и отредактирован в удаленной реплике, он будет обновлен локально при репликации. Моя модель приложения предполагает, что при объединении удаление всегда имеет приоритет: удаленные документы остаются удаленными независимо от того, с каким изменением он конфликтует.

Итак, на первый взгляд проще всего проверить, что _deleted_conflicts не пуст, и если он не пуст, удалите документ, правильно? Ну... проблема заключается в том, что это может также содержать удаленные ревизии, которые были введены путем разрешения конфликтов редактирования на шаге 4, поэтому значение _deleted_conflicts в этом случае является неоднозначным.

Каков канонический способ обработки конфликтов удаления в CouchDB (если есть), который не включает в себя выполнение грубых вещей, таких как маркировка документов как удаленных и фильтрующих на уровне приложения?

4b9b3361

Ответ 1

Лучшим решением было бы использовать зарезервированное свойство _deleted для удаления документов вместо HTTP DELETE. Затем вы можете также установить другие свойства:

doc._deleted = true;
doc.deletedByUser = true;
doc.save();

Затем в процессе слияния установите флажок _changes для _deleted_conflicts и удалите документ, если в _deleted_conflicts есть ревизия с флагом deletedByUser, установленным на true.

Надеюсь, это поможет!