强制couchdb引用附件而不是新版本中的副本

时间:2014-09-16 01:23:43

标签: couchdb attachment

我在couchdb中遇到附件问题。

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

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

编辑: 根据{{​​3}}它应该能够做到但是怎么做?我的(个人安装)默认不这样做!

2 个答案:

答案 0 :(得分:1)

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

所有命令都以bash语法提供,因此您可以轻松复制(只需确保使用正确的文档idrev ision数字)。

为上传创建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

此命令提供包含文档idrev ision的输出,然后应在此处使用

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

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。

答案 1 :(得分:0)

  

这意味着每次您修改文档(而不是   附件,只是文档的一个字段),它将复制100   MB附件。

在我的测试中,我发现相反的情况 - 相同的附件通过同一文档的多个修订链接而不会丢失空间。

请你重新测试以确定这种行为吗?