强制 couchdb 引用附件而不是在新版本中重复

nco*_*hen 5 couchdb attachment

我在 couchdb 中遇到附件问题。

假设我有一个带有大附件的文档 (100 MB)。这意味着每次您修改文档(不是附件,只是文档的一个字段)时,都会复制 100 MB 的附件。

是否可以强制couchdb在未修改附件时创建附件的引用(couchdb可以轻松验证附件是否已使用MD5修改)?

编辑:根据这个它应该能够做到,但是怎么做呢?我的(个人安装)默认情况下不这样做!

Tim*_*mur 1

通常,您期望找到的是 CouchDB 的默认行为。我认为这可能取决于 API 的使用方式。例如,以下示例场景工作正常(在 CouchDB 1.5上)

所有命令均以 bash 语法给出,因此您可以轻松重现(只需确保使用正确的文档idrevision 编号)。

创建10M示例文件用于上传

dd if=/dev/urandom of=attach.dat bs=1024 count=10240

创建测试数据库

curl -X PUT http://127.0.0.1:5984/attachtest

data_size此时数据库预计约为几个字节。您可以按如下方式查询,并查找data_size属性。

curl -X GET http://127.0.0.1:5984/attachtest

在我的测试中给出:

{"db_name":"attachtest","doc_count":1,"doc_del_count":0,"update_seq":2,"purge_seq":0,"compact_running":false,"disk_size":8287,"data_size":407,"instance_start_time":"1413447977100793","disk_format_version":6,"committed_update_seq":2}

创建样本文档

curl -X POST -d '{"hello": "world"}' -H "Content-Type: application/json" http://127.0.0.1:5984/attachtest

id此命令给出带有 document和ision的输出rev,稍后应使用它们

现在,将示例文件附加到文档中;命令应使用上一个输出中记录的 ision idrev

curl -X PUT --data-binary @attach.dat -H "Content-Type: application/octet-stream" http://127.0.0.1:5984/attachtest/DOCUMENT-ID/attachment\?rev\=DOCUMENT-REVISION-1

最后一个命令输出表示修订版 2 已创建,因此文档确实已更新。现在可以查看数据库大小,应该在10000000(10M)左右。data_size再次在以下命令的输出中查找:

curl -X GET http://127.0.0.1:5984/attachtest

现在,从数据库取回文档。然后将使用它来更新它。重要的是其中包含:

  • 文档中的 _rev,以便能够更新它
  • 附件存根,表示附件不应删除,而应保持完整

curl -o document.json -X GET http://127.0.0.1:5984/attachtest/DOCUMENT-ID

更新文档内容,而不更改附件本身(保留存根)。在这里,这只会更改一个属性值。

sed -i 's/world/there/' document.json

并更新数据库中的文档

curl -X PUT -d @document.json -H "Content-Type: application/json" http://127.0.0.1:5984/attachtest/DOCUMENT-ID

最后一个命令输出表示修订版 3 已创建,因此我们现在该文档确实已更新。

最后,现在我们可以验证数据库大小!预期的 data_size 仍然在 10000000 (10M) 左右,而不是 20M:

curl -X GET http://127.0.0.1:5984/attachtest

这应该可以正常工作。例如,在我的机器上它给出:

{"db_name":"attachtest","doc_count":1,"doc_del_count":0,"update_seq":8,"purge_seq":0,"compact_running":false,"disk_size":10535013,"data_size":10493008,"instance_start_time":"1413447977100793","disk_format_version":6,"committed_update_seq":8}

所以,还是10M。