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


87

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

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

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

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

  1. 我创建了新的数据库“ test”并输入仅具有一个属性的简单文档:type:“ auto”

    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
    

Answers:


179

在的上一个调用中Object.bsonsize(),Mongodb返回了光标的大小,而不是文档的大小。

正确的方法是使用此命令:

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

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

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

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


1
如何通过查询获取文档列表的大小?
leon 2015年

但是,当然,此代码将在计算大小之前获取文档。
Sercan Ozdemir

这不会返回足够的大小:(...但这是:stackoverflow.com/a/40993183/3933634
Liberateur

3
如何获取Object.bsonsize,import或required语句是什么?
PARAMANANDA PRADHAN,

7
对于其他错过的人,您必须使用findOne代替find
Sam Sam

36

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

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的建议完成。


这正是我在寻找的东西,但它不起作用,可能与我的mongo版本有关。目前是3.4吗?
Erce

有人得到TypeError: Object.bsonsize is not a function吗?
费利克斯·帕拉迪斯


正确的标签应该是'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(或'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit,

31

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

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

要获取文档的确切大小(以字节为单位),请坚持使用该Object.bsonsize()功能。


谢谢您的答复,在这种情况下,我还有一个与此问题有关的问题:假设我有一个集合,其中带有长标识符列表的文档以列表的形式保存。(标识符最初存储在txt-csv文件中,大小为300 kB;每个标识符的长度为10个字符)。当我在这样的文档上运行bsonsize时,其大小甚至小于481。它返回465。您能否向我解释一下这种情况,请?
user1949763 2014年

4
哪个大小用于强制执行mongDB文档大小限制?Object.bsonsize()?
约翰·埃文斯

MongoDB文档的大小受Mongo的限制,其网站上的手册16MB对此进行了介绍。我尝试导入记录多次达到此限制。
htm11h 2016年

3

在mongodb 4.4(即将发布)中,您可以使用bsonSizeoperator来获取文档大小。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.