如何合并文档的两个冲突修订?

时间:2011-11-18 12:17:43

标签: erlang couchdb

我有两个数据库,在这两个数据库之间触发双向复制。

如果它们之间的网络链接断开,并且在两个数据库中对具有相同Id的特定文档进行了更改,则会发生冲突,并且在链接恢复后可能会选择其中一个修订版本。

我想合并两个相互冲突的修订版,以免丢失任何更改。我怎么能这样做呢?

1 个答案:

答案 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书中提取了上述内容,但我希望它能更明确地说明从哪里开始。