我在 couchdb 中遇到附件问题。
假设我有一个带有大附件 (100 MB) 的文档。这意味着每次修改文档(不是附件,只是文档的一个字段)时,它都会复制 100 MB 的附件。
是否可以强制 couchdb 在未修改的情况下创建附件的引用(couchdb 可以轻松验证附件是否已使用 MD5 修改)?
编辑:
根据 this 它应该能够做到,但怎么做?我的(个人安装)默认不这样做!
最佳答案
通常,您期望找到的是 CouchDB 的默认行为。我认为这可能取决于 API 的使用方式。例如,以下示例场景工作正常(在 CouchDB 1.5 上)
所有命令均以 bash 语法给出,因此您可以轻松重现(只需确保使用正确的文档 id
和 rev
编号)。
创建 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
现在, 从 DB 取回 文档。然后将使用它来更新它。重要的是:
curl -o document.json -X GET http://127.0.0.1:5984/attachtest/DOCUMENT-ID
更新文档内容 ,不更改附件本身(保留 stub )。在这里,这只会改变一个属性值。
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。
关于couchdb - 强制 couchdb 在新版本中引用附件而不是重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25859323/