内置读取couchdb文档大小的方法?

时间:2012-01-14 18:27:53

标签: couchdb

我正在尝试将couchdb用作邮件存储,并希望报告邮件大小。

理想情况下,阅读_size属性会很好。在最坏的情况下,我可以检查整个文档的JSON的字符串长度。我甚至可能希望将大小用作视图键。

您认为记录文档大小的最佳方式是什么?为什么您认为该方法最佳?

3 个答案:

答案 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(因为关键部分会在那里为您提供链接指针)。