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

Erlang 如何合并文档的两个冲突修订?,erlang,couchdb,Erlang,Couchdb,我有两个数据库,在它们之间触发双向复制 如果它们之间的网络链接断开,并且对两个数据库中具有相同Id的特定文档进行了更改,则会发生冲突,并且在恢复链接后,可能会选择其中一个版本而不是另一个版本 我想合并两个相互冲突的修订,以免丢失任何更改。我该怎么做呢?CouchDB在线图书中有一个很好的章节: 您还可以从wiki中阅读: 这里是一些摘录 找出冲突: function(doc) { if(doc._conflicts) { emit(doc._conflicts, null);

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

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


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

CouchDB在线图书中有一个很好的章节:

您还可以从wiki中阅读:

这里是一些摘录

找出冲突:

function(doc) {
  if(doc._conflicts) {
    emit(doc._conflicts, null);
  }
}
一旦发现冲突,就必须确定如何合并这两个文档。CouchDB不做任何假设,所以你必须自己做。这是因为合并是一个域问题。一旦有了执行合并的策略,就可以处理文档了

让我们获得赢家,以及冲突文档

GET /db/bob?conflicts=true
您将获得赢家和一个_conflicts成员,其中包含另一个冲突版本的rev数组。然后,您可以使用后续的GET/db/bob?rev=xxxx操作分别获取它们

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

如上所述,您需要更新一个修订并明确删除所有冲突的修订。这可以通过一次发布到“批量”文档来完成,在您希望删除的修订版上设置“\u deleted”:true


我已经从wiki和CouchDB的书中提取了上述内容,但我希望它能更清楚地说明从何处开始。

CouchDB在线图书中有一个很好的章节:

您还可以从wiki中阅读:

这里是一些摘录

找出冲突:

function(doc) {
  if(doc._conflicts) {
    emit(doc._conflicts, null);
  }
}
一旦发现冲突,就必须确定如何合并这两个文档。CouchDB不做任何假设,所以你必须自己做。这是因为合并是一个域问题。一旦有了执行合并的策略,就可以处理文档了

让我们获得赢家,以及冲突文档

GET /db/bob?conflicts=true
您将获得赢家和一个_conflicts成员,其中包含另一个冲突版本的rev数组。然后,您可以使用后续的GET/db/bob?rev=xxxx操作分别获取它们

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

如上所述,您需要更新一个修订并明确删除所有冲突的修订。这可以通过一次发布到“批量”文档来完成,在您希望删除的修订版上设置“\u deleted”:true


我已经从维基和CouchDB的书中摘录了以上内容,但我希望它能让我们更清楚地了解从哪里开始。

非常感谢Ryan,这确实让我们有所了解。非常感谢Ryan,这确实让我们有所了解。