2014-02-25 42 views
2

我知道当您在数据库A上创建文档时,复制数据库,然后在数据库A和数据库B上对其进行更改,然后再次复制,则会发生冲突,但两个版本都存在版本树。CouchDB复制覆盖文档

但是,当您使用数据库A上的ID XY创建文档,然后在数据库B上创建具有相同标识但内容不同的文档然后复制时,只存在其中一个版本。另一个被覆盖。

原因是,因为两个文档都没有版本,所以复制算法无法知道它们都存在?

如果是的话有两种方式来保存两个版本?

使用案例是有两个数据库,一个本地,一个在线。他们互相同步。在两个数据库用户创建文档。但是我需要确保IF连接失败一段时间后,两者都可以创建文档,并且每当连接返回时我都可以合并它们。我猜这里的硬盘部分是CREATE而不是UPDATE吗?

回答

4

首先,为了清楚起见,CouchDB确实不是覆盖数据。您写入的数据被遗忘的唯一方法是成功更新文档。

CouchDB将在复制期间引入新的分支(又名冲突)以保留所有内容的分歧。如果你看到的是可重现的,那么它就是一个错误。下面是我的成绩单,尽管这表明CouchDB的确如预期的那样保留了两个修订版;

卷曲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”:true,“id”:“mydoc”,“rev”:“1-89248382088d08ccb7183515daf390b8 “}

curl 127.0.0.1:5984/db2/mydoc -XPUT -d'{”foo“:false}'

{ “OK”:真, “ID”: “mydoc”, “REV”: “1-1153b140e4c8674e2e6425c94de860a0”}

卷曲127.0.0.1:5984/_replicate -Hcontent-类型:application/JSON - d '{ “源”: “DB1”, “目标”: “DB2”}'

{ “OK”:真实,...}

卷曲“127.0.0.1:5984/db2/mydoc ?冲突=真”

{ “_id”: “mydoc”, “_ REV”: “1-89248382088d08ccb7183515daf390b8”, “foo” 的:真, “_冲突”:[ “1-1153b140e4c8674e2e6425c94de860a0”]}

+0

你先生是对的!我觉得很愚蠢。出于某种原因,我希望两个版本都可以在蒲团中看到。但是,如果使用{冲突:“true”}或冲突=“true”来获取文档,则两个版本都会显示,我可以照顾合并。谢谢你 – yoshiii1988

+0

你非常欢迎。我们用fauxton取代蒲团,并且计划构建一个显示冲突的用户界面(并帮助您解决它们!)。 –