我知道,当您在数据库 A 上创建文档,复制数据库,然后在 DB A 和 DB B 上对其进行更改,然后再次复制时,您会遇到冲突,但两个版本都存在于修订树中。
但是,当您在 DB A 上创建一个 ID 为 XY 的文档,然后在 DB B 上创建一个 ID 相同但内容不同的文档并进行复制时,只有一个版本存在。另一个被覆盖。
原因是因为两个文档都没有它们的后代版本,所以复制算法无法知道它们都存在吗?
如果是的话,有没有办法保存这两个版本?
用例是有两个数据库,一个是本地的,一个是在线的。它们双向同步。在两个数据库上用户创建文档。但我需要确保如果连接失败一段时间,两者仍然可以创建文档,并且只要连接恢复,我就可以合并它们。我想这里最困难的部分是创建而不是更新,对吗?
最佳答案
首先,为了完全清楚起见,CouchDB 不会覆盖数据。让您写入的数据被遗忘的唯一方法是成功更新文档。
CouchDB 将在复制过程中引入新分支(也称为冲突),以保留内容的所有分歧。如果您所看到的内容是可重现的,那么它就是一个错误。下面是我的记录,它表明 CouchDB 确实按预期保留了两个修订;
curl 127.0.0.1:5984/db1 -XPUT {"ok":true}
curl 127.0.0.1:5984/db2 -XPUT {"ok":true}
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":true,"id":"mydoc","rev":"1-1153b140e4c8674e2e6425c94de860a0"}
curl 127.0.0.1:5984/_replicate -Hcontent-type:application/json -d '{"source":"db1","target":"db2"}'
{"ok":true,...}
curl '127.0.0.1:5984/db2/mydoc?conflicts=true'
{"_id":"mydoc","_rev":"1-89248382088d08ccb7183515daf390b8","foo":true,"_conflicts":["1-1153b140e4c8674e2e6425c94de860a0"]}
关于CouchDB 复制覆盖文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22008551/