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

问题描述:

我有两个数据库,在这两个数据库之间触发双向复制。如何合并文档的两个冲突修订版本?

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

我想合并两个冲突的修订版,以免丢失任何更改。我怎么去解决这个问题?

有一个在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操作单独获取它们。

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

如上所述,您需要更新一个修订版并明确删除所有冲突的修订版。这可以使用_bulk_docs的单个POST完成,在您想要删除的修订版上设置“_deleted”:true。

我已经从wiki和CouchDB书中拉上了上面的内容,但是我希望它能够更清楚地从何处着手。

+0

非常感谢瑞恩,它确实会抛出一些光。 – Fortu