CouchDB 复制覆盖文档

标签 couchdb replication

我知道,当您在数据库 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/

相关文章:

azure - 如何使用 Rest API java 客户端在 couchDB 中创建附件

couchdb - 如何将 CouchDB 复制到桌面浏览器?

sql-server - SQL复制: Access snapshot folder is denied (SQL Server 2008)

android - 如何在android中安装和使用couch db

couchdb - CouchDB 中的 UUID

database - PouchDB 相对远程数据库(使用 CouchDB/Cloudant)

postgresql - postgres master master delta 通过 bucardo 复制到 RDS

MongoDB 独立与副本集以及如何将数据从独立迁移到副本集

mysql - 主到主复制 : Clogged until restart

nosql - 使用 :group_level and :key 的 CouchDB 查询