批量更新CouchDB数据库而没有每个文档的_rev值?

时间:2011-08-08 14:49:25

标签: couchdb

根据CouchDB Wiki on PUT operations

  

要更新现有文档,您还会发出PUT请求。在这种情况下,JSON主体必须包含_rev属性,这样CouchDB才能知道编辑所基于的修订版本。如果当前存储在数据库中的文档的修订版本不匹配,则返回409冲突错误。

我的目标是执行 bulk_docs更新

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json

我的工作流程是这样的:

  1. 我的数据位于Google文档电子表格中。
  2. 我通过复制并粘贴到Mr. Data Converter
  3. 将电子表格数据转换为JSON
  4. 我使用cURL(如上所示)添加/更新文档
  5. 问题是,我第一次添加新文档时,一切都运行正常,但是下次我发布相同的文档时,每个文档都会出现以下错误:

      

    ... {“id”:“28”,“错误”:“冲突”,“原因”:“文档更新冲突。”} ...

    有没有办法在不包含 _rev 属性的情况下更新现有文档?

1 个答案:

答案 0 :(得分:19)

按照设计,您无法盲目更新CouchDB文档,只能尝试更新文档的特定版本。

对于单个文档,您可以使用CouchDB update handler将其隐藏在客户端,因为更新处理程序将传递现有文档(如果存在),包括其修订版。

对于文档集合,在使用_bulk_docs时,您可以添加"new_edits": false强制插入冲突而不是拒绝(尽管您仍需要传递 _rev ,它不一定是现在的那个。)

所有这一切,遵循规则会更好。抓取您要更新的文档的当前版本,尝试更新它,如果您获得409,获取新版本,适当合并,然后再次更新。