Как я могу объединить две противоречивые версии документа? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть две базы данных, между которыми запускается двунаправленная репликация.

В случае разрыва сетевого соединения между ними и внесения изменений в конкретный документ с одинаковым идентификатором в обеих базах данных возникает конфликт, и одна из ревизий может быть выбрана поверх другой после восстановления ссылки. ,

Я хотел бы объединить обе конфликтующие ревизии, чтобы не потерять какие-либо изменения. Как я могу пойти по этому поводу?

1 Ответ

9 голосов
/ 18 ноября 2011

В книге CouchDB есть хорошая глава здесь: http://guide.couchdb.org/draft/conflicts.html

Вы также можете прочитать из вики: http://wiki.apache.org/couchdb/Replication_and_conflicts

Вот некоторые выдержки.

Найдите конфликты:

function(doc) {
  if(doc._conflicts) {
    emit(doc._conflicts, null);
  }
}

Как только вы обнаружите конфликт, вам нужно будет определить, как объединить два документа.CouchDB не делает никаких предположений, поэтому вы должны сделать это самостоятельно.Это потому, что слияние является проблемой домена.Как только у вас есть стратегия выполнения слияния, вы должны работать с документами.

Позволяет получить победителя и конфликтные документы

GET /db/bob?conflicts=true

вы получите победителя плюс член _conflicts, содержащий массив оборотов другой, конфликтующей ревизии,Затем вы можете получить их по отдельности, используя последующие операции GET / db / bob? Rev = xxxx.

После того, как вы получите все конфликтующие ревизии, ваше приложение сможет выбрать отображение всех их пользователю.Или он может попытаться объединить их, записать обратно объединенную версию и удалить конфликтующие версии, то есть разрешить конфликт навсегда.

Как описано выше, вам необходимо обновить одну ревизию и удалить все конфликтующие версии.ревизии явно.Это можно сделать с помощью одного POST для _bulk_docs, установив «_deleted»: true для тех ревизий, которые вы хотите удалить.

Я извлек вышеизложенное из вики и книги CouchDB, но я надеюсь,это делает более понятным, с чего начать.

...