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



我在 couchdb 中的附件有问题。

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

是否可以强制 couchdb

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

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

通常,您希望找到的是 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的输出,然后应在以后使用

现在,将示例文件附加到文档中;命令应使用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。

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

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

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

相关内容

  • 没有找到相关文章

最新更新