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

在新版本中强制couchdb引用附件而不是重复,couchdb,attachment,Couchdb,Attachment,我对couchdb中的附件有问题 假设我有一个带有大附件(100MB)的文档。这意味着每次修改文档(不是附件,只是文档的一个字段)时,它都会复制100 MB的附件 当附件未被修改时,是否可以强制couchdb创建附件的引用(couchdb可以轻松地验证附件是否已被MD5修改) 编辑: 按它应该能做到,但怎么做呢?默认情况下,我的(个人安装)不会这么做 通常,您希望找到的是CouchDB的默认行为。我认为这可能取决于API的使用方式。例如,以下示例场景可以正常工作(在CouchDB1.5上) 所有

我对couchdb中的附件有问题

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

当附件未被修改时,是否可以强制couchdb创建附件的引用(couchdb可以轻松地验证附件是否已被MD5修改)

编辑:
按它应该能做到,但怎么做呢?默认情况下,我的(个人安装)不会这么做

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

所有命令都以bash语法给出,因此您可以轻松地复制(只需确保使用正确的文档
id
rev
ision编号)

创建10M样本文件进行上传

dd if=/dev/uradom of=attach.dat bs=1024 count=10240

创建测试数据库

curl-X PUThttp://127.0.0.1:5984/attachtest

此时,数据库预期的
数据大小约为几个字节。您可以按如下方式查询它,并查找
数据\u size
属性

curl-X GEThttp://127.0.0.1:5984/attachtest

在我的测试中给出:

{“db\u name”:“attachtest”,“doc\u count”:1,“doc\u del\u count”:0,“update\u seq”:2,“purge\u seq”:0,“compact\u running”:false,“disk\u size”:8287,“data\u size”:407
,“instance\u start\u time”:“1413447977100793”,“disk\u format\u version”:6,“committed\u update\u seq”:2

创建示例文档

curl-xpost-d'{“hello”:“world”}'-H“内容类型:application/json”http://127.0.0.1:5984/attachtest

该命令给出了一个带有document
id
rev
ision的输出,以后应该使用它们

现在,将示例文件附加到文档;命令应使用上一个命令的输出中记录的
id
rev
ision:

curl-X PUT--data binary@attach.dat-H“内容类型:应用程序/八位字节流”http://127.0.0.1:5984/attachtest/DOCUMENT-ID/附件\?修订\=文件修订版-1

最后一个命令输出表示已创建修订版2,因此文档确实已更新。现在可以检查数据库大小,它应该在10000000(10M)左右。再次在以下命令的输出中查找
data\u size

curl-X GEThttp://127.0.0.1:5984/attachtest

现在,从DB取回文档。然后将使用它来更新它。重要的是要有:

  • 文档中的_版本,以便能够更新它
  • 附件存根,表示不应删除附件,但应保持完整
curl-o document.json-X GEThttp://127.0.0.1:5984/attachtest/DOCUMENT-ID

更新文档内容,不更改附件本身(保留存根)。这里只需更改一个属性值

sed-i的/world/there/'document.json

并在数据库中更新文档

curl-X PUT-d@document.json-H“内容类型:application/json”http://127.0.0.1:5984/attachtest/DOCUMENT-ID

最后一个命令输出表示已经创建了修订版3,因此我们现在知道文档确实已经更新了

最后,现在我们可以验证数据库大小了!预期数据大小仍在10000000(10M)左右,而不是20M:

curl-X GEThttp://127.0.0.1:5984/attachtest

这应该很好。例如,在我的机器上,它提供:

{db\u name:“attachtest”,“doc\u count”:1,“doc\u del\u count”:0,“update\u seq”:8,“purge\u seq”:0,“compact\u running”:false,
“disk\u size”:10535013,“data\u size”:10493008,
“instance\u start\u time:“1413447977100793”,“disk\u format\u version”:6,“committed\u update\u seq”:8

所以,还是1000万

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

在我的测试中,我发现了相反的情况——同一个附件通过同一文档的多个修订链接在一起,没有空间损失


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

这不是一个很好的回答,但我通常不喜欢附件功能,而是在内部管理仅通过URL引用的文档。它还允许您引用两个完全不同的文档中的相同“附件”。事实上,这不是一个很好的答案:o)我读了以下内容:所以它应该存在!您正在使用哪个版本的CouchDB?你能用几个简单的步骤重现这种行为吗?例如,当我使用Futon创建一个示例文档时,上传一个附件,然后在之后修改文档-它不会在最后两个步骤之间更改数据库大小。我猜行为取决于您使用什么API以及如何使用。你能给我一个exmaple吗?我使用的是PockDB,所以我没有同样的灵活性来管理请求。但是,您是否尝试将另一个10M文件添加到同一文档中?你的分贝是20米还是30米?我使用的是couchdb 1.5Ah,好吧,可能会有所不同-我没有尝试过,所以说不出来。至于添加具有相同附件的新文档-据我所知,CouchDB不会尝试确定附件是否相同-毕竟根据API,您可以创建新文档/附件。因此,您可以做的是在应用程序级别管理此案例。例如,将附件存储在专用文档或专用数据库中,并从其他文档中“引用”它们。在这种情况下,你可能会