我遇到了一个奇怪的mongo行为,我想稍微澄清一下......
我的要求很简单:我想在集合中获得单个文档的大小。
我找到了两种可能的解决方案:
在这里,我提供了一些我执行测试的代码:
我创建了新的数据库'test'并输入只有一个属性的简单文档:type:“auto”
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
答案 0 :(得分:131)
我找到了解决方案。在之前调用的 Object.bsonsize 中,mongo返回了CURSOR的大小而不是文档本身。
正确的方法是使用此命令:
Object.bsonsize(db.test.findOne({type:"auto"}))
这将返回特定文档的正确大小(以字节为单位)。
答案 1 :(得分:25)
由于Record Padding机制,文档在集合中的有效空间量将超过文档的大小。
这就是为什么db.test.stats()
和Object.bsonsize(..)
的输出之间存在差异。
要获得文档的完全大小(以字节为单位),请坚持使用Object.bsonsize()
函数。
答案 2 :(得分:18)
我建议使用此脚本来获取实际大小。
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建议完成。
答案 3 :(得分:3)
使用mongodb 4.4 (即将推出),您可以使用bsonSize
运算符来获取文档大小。
db.test.aggregate([
{
"$project": {
"name": 1,
"object_size": { "$bsonSize": "$$ROOT" }
}
}
])
答案 4 :(得分:1)
Object.bsonsize(db.test.findOne({type:“ auto”}))) 它以字节为单位。