我在couchdb中遇到附件问题。
假设我有一个带有大附件的文档(100 MB)。这意味着每次修改文档(而不是附件,只是文档的一个字段)时,它将复制100 MB附件。
是否可以强制couchdb在未修改附件时创建附件的引用(couchdb可以轻松验证是否已使用MD5修改附件)?
编辑: 根据{{3}}它应该能够做到但是怎么做?我的(个人安装)默认不这样做!
答案 0 :(得分:1)
通常,您期望找到的是CouchDB的默认行为。我认为这可能取决于API的使用方式。例如,以下示例场景工作正常(在CouchDB 1.5 上)
所有命令都以bash语法提供,因此您可以轻松复制(只需确保使用正确的文档id
和rev
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
此命令提供包含文档id
和rev
ision的输出,然后应在此处使用
现在,将示例文件附加到文档中;命令应该使用前一个输出中记录的id
和rev
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
现在,从数据库中恢复文档。然后将使用它来更新它。重要的是:
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附件。
在我的测试中,我发现相反的情况 - 相同的附件通过同一文档的多个修订链接而不会丢失空间。
请你重新测试以确定这种行为吗?