Javascript 如何编写一个CouchDB视图,列出每个存储文档的大小?

Javascript 如何编写一个CouchDB视图,列出每个存储文档的大小?,javascript,couchdb,Javascript,Couchdb,我想知道存储在CouchDB数据库中的文档的大小。如何编写一个列出文档大小的视图?回答我自己的问题,我发现这是可以接受的(包括Marcello的评论): 编辑:结合@dch,这是对线外大小的更完整估计,但正如他所指出的,这不是磁盘上文档的大小 function(doc) { var json = JSON.stringify(doc); var len = json.length; if (doc._attachments) { for (var attachmentKey

我想知道存储在CouchDB数据库中的文档的大小。如何编写一个列出文档大小的视图?

回答我自己的问题,我发现这是可以接受的(包括Marcello的评论):

编辑:结合@dch,这是对线外大小的更完整估计,但正如他所指出的,这不是磁盘上文档的大小

function(doc) {
  var json = JSON.stringify(doc);
  var len = json.length;
  if (doc._attachments) {
    for (var attachmentKey in doc._attachments) {
      var attachment = doc._attachments[attachmentKey];
      len += attachment.length;
    }
  }
  emit(len, null);
}

和往常一样,答案在一定程度上取决于您打算如何处理这些数据

  • 在CouchDB 1.2.0及更高版本中,snappy压缩将确保每个文档的磁盘大小比stringify计算小很多
  • 在任何情况下,CouchDB都会将JSON存储为编码的erlang术语,这也不是一对一的大小等价
  • 附件不会记录在您的方法中,但可以在存根元数据中找到:
{
“_id”:“555b17372035fdeb9b4077c68e00053f”,
“修订版”:“3-a6fa3aadf3bf64f11b721d7d4333e9ec”,
“_附件”:{
“preview.png”:{
“内容类型”:“图像/png”,
“revpos”:3,
“摘要”:“md5-fNhm5TL2NFnsujYKixr+3A=”,
“长度”:328076,
“存根”:正确
}
}
}

两个注释。使用
var json=…
避免声明或更糟的是修改全局变量。正如@dch所指出的,您应该添加每个附件的大小。太好了!最后一个提示:应该避免将
doc
s放在索引中。它将使您的存储需求翻倍。你是对的,stringify不会给我磁盘大小,但它会给我超线大小,这正是我感兴趣的。你说得对,我忽略了附件。我不会在我的应用程序中使用它们,但我会更新答案,使其更完整。谢谢
function(doc) {
  var json = JSON.stringify(doc);
  var len = json.length;
  if (doc._attachments) {
    for (var attachmentKey in doc._attachments) {
      var attachment = doc._attachments[attachmentKey];
      len += attachment.length;
    }
  }
  emit(len, null);
}
{ "_id":"555b17372035fdeb9b4077c68e00053f", "_rev":"3-a6fa3aadf3bf64f11b721d7d4333e9ec", "_attachments":{ "preview.png":{ "content_type":"image/png", "revpos":3, "digest":"md5-fNhm5TL2NFnsujYKixr+3A==", "length":328076, "stub":true } } }