CouchDB对_changes请求的响应以这种格式返回: { “SEQ”:12, “ID”: “foo” 的, “改变”:[{ “REV”: “1-23202479633c2b380f79507a776743d5”}]}
我的问题 - 为什么“更改”元素是一个数组?什么情况会在changes元素中返回多个项目?我从未在网上看过一个有多个项目的例子,根据我自己的经验,我只看过一个项目。
我正在编写与更改交互的代码,而且我想了解如果事实上有多个项目该怎么做。
谢谢, 麦克
答案 0 :(得分:8)
changes元素是一个数组,用于反映文档的所有现有修订叶。如您所知,CouchDB不会完全删除文档,而是设置墓碑,以防止他从具有尚未删除的旧版本的源复制后意外复活。由于复制后发生的更新冲突,也可能有多个叶子。例如:
Mike在数据库A中创建了文档并将其复制到数据库B:
{ “结果”:[ { “SEQ”:1, “ID”: “东西”, “变更”:[{ “REV”: “1-967a00dff5e02add41819138abb3284d”}]} ] “last_seq”:1}
John已收到您的文件,并在数据库B中更新了他:
{ “结果”:[ { “SEQ”:2 “ID”: “东西”, “变更”:[{ “REV”: “2-7051cbe5c8faecd085a3fa619e6e6337”}]} ] “last_seq”:2}
但同时Mike在数据库A中也为他做了一些改动(忘了清理数据或添加重要内容):
{ “结果”:[ { “SEQ”:2 “ID”: “东西”, “变更”:[{ “REV”: “2-13839535feb250d3d8290998b8af17c3”}]} ] “last_seq”:2}
并将他再次复制到数据库B. John收到处于冲突状态的文档,并查看带有查询参数style=all_docs
的更改提要,请参阅下一个结果:
{ “结果”:[ { “SEQ”:3 “ID”: “东西”, “变更”:[{ “REV”: “2-7051cbe5c8faecd085a3fa619e6e6337”},{ “REV”: “2-13839535feb250d3d8290998b8af17c3”}]} ] “last_seq”:3}
虽然直接访问文档可以从修改版本(具有更高的seq编号或最新版本)返回他的数据,但是他可能有许多冲突的修订版本(想象单个文档的并发写入它在彼此之间复制的十几个数据库中)
现在约翰决定解决这个冲突并更新实际版本,但放弃另一个:
{ “结果”:[ { “SEQ”:4 “ID”: “东西”, “变更”:[{ “REV”: “3-2502757951d6d7f61ccf48fa54b7e13c”},{ “REV”: “2-13839535feb250d3d8290998b8af17c3”}]} ] “last_seq”:4}
等等,迈克的修改还在吗?为什么?恐慌中约翰删除了他的文件:
{ “结果”:[ { “SEQ”:5 “ID”: “东西”, “变更”:[{ “REV”: “2-13839535feb250d3d8290998b8af17c3”} { “REV”: “4-149c48caacb32c535ee201b6f02b027b”}]} ] “last_seq”:5}
现在他的文档版本已删除,但他可以访问Mike的文档。
将John从数据库B更改复制到数据库A将全部带来逻辑删除:
{ “结果”:[ { “SEQ”:3 “ID”: “东西”, “变更”:[{ “REV”: “3-2adcbbf57013d8634c2362630697aab6”},{ “REV”: “4-149c48caacb32c535ee201b6f02b027b”}]} ] “last_seq”:3}
为什么这样?因为这是关于他的数据“进化”的文档历史记录:在现实世界中,您的文档可能有许多分布在大量数据库中的中间叶子,并防止数据复制过程中的静默数据覆盖CouchDB保持每个叶子有助于解决此类冲突。您可以在CouchDB wiki中找到更多可能更好的解释replication and conflicts。此处还会对Feed query parameters进行更改。