根据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
我的工作流程是这样的:
问题是,我第一次添加新文档时,一切都运行正常,但是下次我发布相同的文档时,每个文档都会出现以下错误:
... {“id”:“28”,“错误”:“冲突”,“原因”:“文档更新冲突。”} ...
有没有办法在不包含 _rev 属性的情况下更新现有文档?
答案 0 :(得分:19)
按照设计,您无法盲目更新CouchDB文档,只能尝试更新文档的特定版本。
对于单个文档,您可以使用CouchDB update handler将其隐藏在客户端,因为更新处理程序将传递现有文档(如果存在),包括其修订版。
对于文档集合,在使用_bulk_docs
时,您可以添加"new_edits": false
强制插入冲突而不是拒绝(尽管您仍需要传递 _rev ,它不一定是现在的那个。)
所有这一切,遵循规则会更好。抓取您要更新的文档的当前版本,尝试更新它,如果您获得409,获取新版本,适当合并,然后再次更新。