Mongo =获取单个文件的大小

我遇到了mongo的一个奇怪的行为,我想澄清一下…
我的要求很简单,我想在集合中获得单个文档的大小。 我find了两个可能的解

  • Object.bsonsize – 一些JavaScript方法,应该返回一个字节的大小
  • db.collection.stats() – 其中有一行“avgObjSize”,它会产生一些数据的“聚合”(平均)大小的视图。 它只是表示单个文档的平均大小。
  • 当我只用一个文档创buildtesting集合时,两个函数都会返回不同的值。 这怎么可能?
    它是否存在一些其他方法来获得mongo文档的大小?

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

  1. 我创build了新的数据库“testing”,并input简单的文件只有一个属性:types:“自动”

    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 

我find了一个解决scheme。 在之前调用Object.bsonsize的时候, mongo返回的是CURSOR的大小,而不是文件本身。

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

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

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

由于logging填充机制,文档在收集中占用的有效空间将超过文档的大小。

这就是db.test.stats()Object.bsonsize(..)的输出有差别的原因。

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

我build议使用这个脚本来获得真正的大小。

 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为您的build议完成。