我有两个数据库,在这两个数据库之间触发双向复制。
如果它们之间的网络链接断开,并且在两个数据库中对具有相同Id的特定文档进行了更改,则会发生冲突,并且在链接恢复后可能会选择其中一个修订版本。
我想合并两个相互冲突的修订版,以免丢失任何更改。我怎么能这样做呢?
答案 0 :(得分:9)
CouchDB在线预订了一个很好的章节: http://guide.couchdb.org/draft/conflicts.html
您还可以阅读wiki: 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书中提取了上述内容,但我希望它能更明确地说明从哪里开始。