繁体   English   中英

Mongodb如何获取单个文档的大小?

[英]How to get the size of single document in Mongodb?

我遇到了mongo的一个奇怪行为,我想澄清一下......
我的要求很简单:我想在集合中获取单个文档的大小。 我找到了两种可能的解决方案:

  • Object.bsonsize - 一些应该返回字节大小的 javascript 方法
  • db.collection.stats() - 有一行 'avgObjSize' 在数据上产生一些“聚合”(平均)大小视图。 它只是表示单个文档的平均大小。

  • 当我只用一个文档创建测试集合时,两个函数都返回不同的值。 这怎么可能?
    是否存在其他方法来获取 mongo 文档的大小?

在这里,我提供了一些我执行测试的代码:

  1. 我创建了新的数据库“测试”并输入了只有一个属性的简单文档:类型:“自动”

     db.test.insert({type:"auto"})
  2. stats() 函数调用的输出: db.test.stats()

     { "ns" : "test.test", "count" : 1, "size" : 40, "avgObjSize" : 40, "storageSize" : 4096, "numExtents" : 1, "nindexes" : 1, "lastExtentSize" : 4096, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 8176, "indexSizes" : { "_id_" : 8176 }, "ok" : 1

    }

  3. bsonsize 函数调用的输出: Object.bsonsize(db.test.find({test:"auto"}))

     481

在之前的Object.bsonsize()调用中,Mongodb 返回的是游标的大小,而不是文档。

正确的方法是使用这个命令:

Object.bsonsize(db.test.findOne())

使用findOne() ,您可以定义对特定文档的查询:

Object.bsonsize(db.test.findOne({type:"auto"}))

这将返回特定文档的正确大小(以字节为单位)。

我建议使用此脚本来获取实际大小。

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

注意:如果您的 ID 是 64 位整数,则上述内容将在打印时截断 ID 值! 如果是这种情况,您可以改用:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

这也有返回 JSON 的优势,所以像 RoboMongo 这样的 GUI 可以将它制表!

来源: https : //stackoverflow.com/a/16957505/3933634

编辑:感谢@zAlbee的建议完成。

由于记录填充机制,文档在集合中占用的有效空间量将大于文档的大小。

这就是db.test.stats()Object.bsonsize(..)的输出之间存在差异的原因。

要获得文档的确切大小(以字节为单位),请坚持使用Object.bsonsize()函数。

使用 mongodb 4.4 (即将推出),您可以使用bsonSize运算符来获取文档大小。

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

Object.bsonsize(db.test.findOne({type:"auto"})) 它以字节为单位给出。

方法Object.bsonsize()仅在旧版mongo shell 中可用。 在新的mongosh中,您必须使用包bson

const BSON = require("bson");

BSON.calculateObjectSize({field: "value"})

BSON.calculateObjectSize(db.test.findOne())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM