如何合并文档的两个冲突修订版本?
问题描述:
我有两个数据库,在这两个数据库之间触发双向复制。如何合并文档的两个冲突修订版本?
如果它们之间的网络链接中断,并且在两个数据库中具有相同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书中拉上了上面的内容,但是我希望它能够更清楚地从何处着手。
非常感谢瑞恩,它确实会抛出一些光。 – Fortu