Разрешение конфликтов репликации для удаленных документов в CouchDB
Способом разрешения конфликтов репликации, рекомендованных официальной документацией, является:
- Прочитайте конфликтующие версии с использованием поля document
_conflicts
(например, через представление)
- Получить документы для всех перечисленных изменений
- Выполнение слияния приложений
- Удаление нежелательных изменений
Проблема возникает, когда я хочу объединить удаленные документы. Они не отображаются в поле _conflicts
, но в _deleted_conflicts
. Если я объединю только поле _conflicts
, и документ будет удален в локальной базе данных и отредактирован в удаленной реплике, он будет обновлен локально при репликации. Моя модель приложения предполагает, что при объединении удаление всегда имеет приоритет: удаленные документы остаются удаленными независимо от того, с каким изменением он конфликтует.
Итак, на первый взгляд проще всего проверить, что _deleted_conflicts
не пуст, и если он не пуст, удалите документ, правильно? Ну... проблема заключается в том, что это может также содержать удаленные ревизии, которые были введены путем разрешения конфликтов редактирования на шаге 4, поэтому значение _deleted_conflicts
в этом случае является неоднозначным.
Каков канонический способ обработки конфликтов удаления в CouchDB (если есть), который не включает в себя выполнение грубых вещей, таких как маркировка документов как удаленных и фильтрующих на уровне приложения?
Ответы
Ответ 1
Лучшим решением было бы использовать зарезервированное свойство _deleted
для удаления документов вместо HTTP DELETE
. Затем вы можете также установить другие свойства:
doc._deleted = true;
doc.deletedByUser = true;
doc.save();
Затем в процессе слияния установите флажок _changes для _deleted_conflicts
и удалите документ, если в _deleted_conflicts есть ревизия с флагом deletedByUser
, установленным на true
.
Надеюсь, это поможет!