Mongo =获取单个文件的大小
我遇到了mongo的一个奇怪的行为,我想澄清一下…
我的要求很简单,我想在集合中获得单个文档的大小。 我find了两个可能的解
- Object.bsonsize – 一些JavaScript方法,应该返回一个字节的大小
- db.collection.stats() – 其中有一行“avgObjSize”,它会产生一些数据的“聚合”(平均)大小的视图。 它只是表示单个文档的平均大小。
当我只用一个文档创buildtesting集合时,两个函数都会返回不同的值。 这怎么可能?
它是否存在一些其他方法来获得mongo文档的大小?
在这里,我提供了一些我正在执行testing的代码:
-
我创build了新的数据库“testing”,并input简单的文件只有一个属性:types:“自动”
db.test.insert({type:"auto"})
-
从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
}
-
从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议完成。