在CouchDB _changes响应中,为什么"更改"元素数组?

Mik*_*man 5 couchdb

CouchDB对_changes请求的响应以这种格式返回:{"seq":12,"id":"foo","changes":[{"rev":"1-23202479633c2b380f79507a776743d5"}}}

我的问题 - 为什么"更改"元素是一个数组?什么情况会在changes元素中返回多个项目?我从未在网上看过一个有多个项目的例子,根据我自己的经验,我只看过一个项目.

我正在编写与变化交互的代码,如果事实上有多个项目,我想知道该怎么做.

谢谢,迈克

Kxe*_*pal 8

changes元素是一个数组,用于反映文档的所有现有修订叶.如您所知,CouchDB不会完全删除文档,而是设置墓碑,以防止他从具有尚未删除的旧版本的源复制后意外复活.由于复制后发生的更新冲突,也可能有多个叶子.例如:

  1. Mike在数据库A中创建了文档并将其复制到数据库B:

    { "结果":[{ "SEQ":1, "ID": "东西", "变更":[{ "REV": "1-967a00dff5e02add41819138abb3284d"}]}], "last_seq":1}

  2. John已收到您的文档并在数据库B中更新了他:

    {"results":[{"seq":2,"id":"thing","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}],"last_seq":2}

  3. 但同时Mike也在数据库A中为他做了一些改动(忘了清理数据或添加重要内容):

    { "结果":[{ "SEQ":2 "ID": "东西", "变更":[{ "REV": "2-13839535feb250d3d8290998b8af17c3"}]}], "last_seq":2}

  4. 并将他再次复制到数据库B. John收到处于冲突状态的文档,并通过查看带有查询参数的更改提要style=all_docs查看下一个结果:

    {"results":[{"seq":3,"id":"thing","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"},{"rev":"2-13839535feb250d3d8290998b8af17c3"}] }],"last_seq":3}

    虽然对文档直接访问从美酒版本(具有较高的序列号,或只是最新的),所以可以返回他的数据,他有许多矛盾的版本(想象这之间相互复制十几种数据库内单个文件就可以并发写入)的

  5. 现在约翰决定解决这个冲突并更新实际修订版,但放弃另一个:

    {"results":[{"seq":4,"id":"thing","changes":[{"rev":"3-2502757951d6d7f61ccf48fa54b7e13c"},{"rev":"2-13839535feb250d3d8290998b8af17c3"}] }],"last_seq":4}

  6. 等等,迈克的修改还在吗?为什么?恐慌的约翰删除了他的文件:

    {"results":[{"seq":5,"id":"thing","changes":[{"rev":"2-13839535feb250d3d8290998b8af17c3"} {"rev":"4-149c48caacb32c535ee201b6f02b027b"}]} ],"last_seq":5}

    现在他的文档版本已删除,但他可以访问Mike的文档版本.

  7. 将John从数据库B更改复制到数据库A将全部带来墓碑:

    {"results":[{"seq":3,"id":"thing","changes":[{"rev":"3-2adcbbf57013d8634c2362630697aab6"},{"rev":"4-149c48caacb32c535ee201b6f02b027b"}] }],"last_seq":3}

    为什么这样?因为这是关于他的数据"进化"的文档历史:在现实世界中,您的文档可能有许多分布在大量数据库中的中间叶子,并防止由于数据复制过程而导致静默数据覆盖CouchDB保持每个叶子有助于解决此类冲突.您可能在CouchDB wiki中找到更多可能更好的解释有关复制和冲突的解释.此处还描述了更改Feed 查询参数.