我在 couchdb 中遇到附件问题。

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

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

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

最佳答案

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

所有命令均以 bash 语法给出,因此您可以轻松重现(只需确保使用正确的文档 idrev 编号)。

创建 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
现在, 从 DB 取回 文档。然后将使用它来更新它。重要的是:

  • 文档中的_rev,可以更新它
  • 附件 stub ,表示附件不应被删除,但保持完整
  • 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/

    10-13 08:00