我在 couchdb 中的附件有问题。
假设我有一个带有大附件 (100 MB( 的文档。这意味着每次修改文档(不是附件,只是文档的一个字段(时,它都会复制 100 MB 的附件。
是否可以强制 couchdb在未修改附件时创建附件的引用(couchdb 可以轻松验证附件是否已使用 MD5 修改(?
编辑:根据这一点,它应该能够做到,但如何做到呢?我的(个人安装(默认情况下不这样做!
通常,您希望找到的是 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
的输出,然后应在以后使用
现在,将示例文件附加到文档中;命令应使用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
现在,从数据库取回文档。然后它将用于更新它。重要的是:
- 文档中的_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。
这意味着每次修改文档时(不是 附件,仅文档的一个字段(,它将复制 100 MB 附件。
在我的测试中,我发现了相反的情况 - 同一附件通过同一文档的多个修订链接,而不会丢失空间。
请您重新测试以确定这种行为吗?