我正在尝试将couchdb用作邮件存储,并希望报告邮件大小。
理想情况下,阅读_size属性会很好。在最坏的情况下,我可以检查整个文档的JSON的字符串长度。我甚至可能希望将大小用作视图键。
您认为记录文档大小的最佳方式是什么?为什么您认为该方法最佳?
答案 0 :(得分:9)
你可以发表观点;
function (doc) {
emit(doc._id, JSON.stringify(doc).length);
}
答案 1 :(得分:6)
您可以发出HEAD请求:
$ curl -X HEAD -I http://USER:PASS@localhost:5984/db/doc_id
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R14B03)
Etag: "1-c0b6a87a64fa1b1f63ee2aa7828a5390"
Date: Tue, 17 Jan 2012 21:32:43 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 740047
Cache-Control: must-revalidate
Content-Length标头包含文档的长度(以字节为单位)。这非常快,因为您不需要下载完整的文档。
但有一点需要注意:Content-Length是文档的utf-8版本的 bytes 的数量(参见Content-Type标题); String.length是字符串中16位utf-16 代码单元的数量。
即,他们正在计算不同的东西,字节与代码单元,文件的不同编码,utf-8与utf-16。
答案 2 :(得分:0)
根据接受的答案,我建议进行以下改进:
function (doc) {
emit([JSON.stringify(doc).length, doc._id], doc._id);
}
这具有以下优点:
文档长度,因为第一个关键部分允许您按文档大小排序。
doc id作为第二个关键部分,可确保具有相同大小的文档显示为单独的条目。
值部分中的doc id使得在蒲团时更容易复制ID(因为关键部分会在那里为您提供链接指针)。