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

内置读取couchdb文档大小的方法?,couchdb,Couchdb,我正在尝试将couchdb用作消息存储,并希望报告消息大小 理想情况下,最好读取一个_size属性。最糟糕的情况是,我可以检查整个文档JSON的字符串长度。我甚至可能想将大小用作视图键 您认为记录文档大小的最佳方法是什么?为什么您认为该方法最好?您可以查看 function (doc) { emit(doc._id, JSON.stringify(doc).length); } 您可以提出HEAD请求: $ curl -X HEAD -I http://USER:PASS@localh

我正在尝试将couchdb用作消息存储,并希望报告消息大小

理想情况下,最好读取一个_size属性。最糟糕的情况是,我可以检查整个文档JSON的字符串长度。我甚至可能想将大小用作视图键

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

您可以查看

function (doc) {
    emit(doc._id, JSON.stringify(doc).length);
}

您可以提出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版本的字节数(参见Content-Type标题);是字符串中16位utf-16代码单元的数目


i、 例如,他们正在计算不同的内容,字节与代码单位,文档的不同编码,utf-8与utf-16。

根据公认的答案,我建议进行以下改进:

function (doc) {
    emit([JSON.stringify(doc).length, doc._id], doc._id);
}
这有以下优点:

  • 文档长度作为第一个关键部分,允许您按文档大小进行排序

  • 作为第二个关键部分的文档id确保具有相同大小的文档显示为单独的条目

  • 值部分中的doc id使得在futon中复制id更容易(因为关键部分在那里为您提供了一个链接指针)


这也是一个很好的答案。因为我想知道能够在索引中使用大小,所以这次我更喜欢另一个答案。@Marcello回答得不错,但有一点很小——所有utf-16码点真的都是16位吗?@Armand AFAIK,是的(我不是Unicode专家)。但有些字符由多个代码点表示。这一点在.Hmm怪异中得到了清楚的解释-我仍然不是100%清楚字符和代码点之间的区别,但是:编码是可变长度的,因为代码点是用一个或两个16位代码单元编码的。谢谢,Marcello-这非常清楚:-)但是从维基百科上看,UTF-16代码点可能是两个代码单元,这将使代码点为32位。因此,您的答案可能需要稍微澄清一下,其中的“String.length是16位utf-16代码点的数量”?是否有任何方法可以在其中包含附件的大小?警告:这不是以字节为单位的长度。这是。此
长度
值是否包括
\u附件