我知道当您在数据库A上创建文档时,复制数据库,然后在数据库A和数据库B上对其进行更改,然后再次复制,您将遇到冲突,但修订树中存在这两个版本。
但是当您在DB A上创建具有Id XY的Doc,然后在DB B上创建具有相同Id但内容不同的Doc然后进行复制时,只存在其中一个版本。另一个被覆盖。
原因是什么,因为两个文件都没有版本,所以复制算法不能知道它们都存在?
如果是,是否有一种方法可以保存这两个版本?
Use Case是有两个数据库,一个是本地数据库,一个是在线数据库。他们是双向同步的。在两个DB上,用户创建文档。但我需要确保如果连接失败一段时间,CAN仍然可以创建文档,并且我可以在连接恢复时合并它们。我想这里的难点是CREATE而不是UPDATE吧?
答案 0 :(得分:4)
首先,为了完全清晰,CouchDB 不覆盖数据。您编写的数据遗忘的唯一方法是成功更新文档。
CouchDB将在复制期间引入新分支(即冲突)以保留内容的所有差异。如果你所看到的是可重复的,那么它就是一个bug。下面是我的成绩单,虽然这表明CouchDB确实按预期保留了两个版本;
curl 127.0.0.1:5984/db1 -XPUT { “OK”:真}
卷曲127.0.0.1:5984/db2 -XPUT { “OK”:真}
curl 127.0.0.1:5984/db1/mydoc -XPUT -d'{“foo”:true}'
{ “OK”:真, “ID”: “mydoc”, “REV”: “1-89248382088d08ccb7183515daf390b8”}
curl 127.0.0.1:5984/db2/mydoc -XPUT -d'{“foo”:false}'
{ “OK”:真, “ID”: “mydoc”, “REV”: “1-1153b140e4c8674e2e6425c94de860a0”}
curl 127.0.0.1:5984/_replicate -Hcontent-type:application / json -d'{“source”:“db1”,“target”:“db2”}'
{ “OK”:真,...}
卷曲'127.0.0.1:5984/db2/mydoc?conflicts=true'
{ “_ ID”: “mydoc”, “_ REV”: “1-89248382088d08ccb7183515daf390b8”, “foo” 的:真, “_冲突”:[ “1-1153b140e4c8674e2e6425c94de860a0”]}