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

For*_*rtu 1 erlang couchdb

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

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

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

Rya*_*age 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

找到冲突后,您必须确定如何合并这两个文档.CouchDB不做任何假设,所以你必须自己做.这是因为合并是域问题.一旦你有了执行合并的策略,你就可以处理文档了.

让我们获得胜利者和冲突文件

GET /db/bob?conflicts=true
Run Code Online (Sandbox Code Playgroud)

您将获得胜利者加上一个_conflicts成员,其中包含其他相互冲突的修订版本的转数.然后,您可以使用后续的GET/db/bob?rev = xxxx操作单独获取它们.

一旦检索到所有冲突的修订,您的应用程序就可以选择将它们全部显示给用户.或者它可以尝试合并它们,写回合并的版本,并删除冲突的版本 - 即永久解决冲突.

如上所述,您需要更新一个修订版并明确删除所有冲突的修订版.这可以使用单个POST到_bulk_docs来完成,设置"_deleted":对于您要删除的修订版本为true.

我已经从维基和CouchDB书中提取了上述内容,但我希望它能更清楚地说明从哪里开始.