Javascript 如何获取Mongodb中单个文档的大小?
我遇到了mongo的一个奇怪行为,我想澄清一下…Javascript 如何获取Mongodb中单个文档的大小?,javascript,mongodb,document,objectid,objectsize,Javascript,Mongodb,Document,Objectid,Objectsize,我遇到了mongo的一个奇怪行为,我想澄清一下… 我的要求很简单:我想在集合中获得单个文档的大小。 我找到了两种可能的解决方案: Object.bsonsize—一些javascript方法,应该返回以字节为单位的大小 db.collection.stats()-其中有一行“avgObjSize”,该行在数据上生成一些“聚合”(平均)大小视图。它只是表示单个文档的平均大小 当我仅使用一个文档创建测试集合时,两个函数都返回不同的值。怎么可能呢 是否存在其他方法来获取mongo文档的大小 在这
我的要求很简单:我想在集合中获得单个文档的大小。 我找到了两种可能的解决方案:
- Object.bsonsize—一些javascript方法,应该返回以字节为单位的大小
- db.collection.stats()-其中有一行“avgObjSize”,该行在数据上生成一些“聚合”(平均)大小视图。它只是表示单个文档的平均大小
当我仅使用一个文档创建测试集合时,两个函数都返回不同的值。怎么可能呢
是否存在其他方法来获取mongo文档的大小
由于该机制,文档在集合中所占的有效空间将超过文档的大小 这就是为什么
db.test.stats()
和Object.bsonsize(…)
的输出之间存在差异的原因
要获得文档的确切大小(字节),请坚持使用
Object.bsonsize()
函数。在上一次调用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可以将其制成表格
来源:
编辑:感谢您的建议完成。Object.bsonsize(db.test.findOne({type:“auto”}))
它以字节为单位 使用mongodb4.4(即将推出),您可以使用运算符获取文档大小
db.test.aggregate([
{
"$project": {
"name": 1,
"object_size": { "$bsonSize": "$$ROOT" }
}
}
])
感谢您的回复,在这种情况下,我还有一个关于这个问题的问题:假设我有一个集合,其中以列表的形式保存具有长标识符列表的文档。(标识符最初存储在txt csv文件中,大小为300 kB;每个标识符的长度为10个字符)在这样的文档上运行bsonsize时,其大小甚至低于481。它返回465。你能给我解释一下这种情况吗?使用哪种大小来强制执行mongDB文档大小限制?Object.bsonsize()?MongoDB文档大小是Mongo的一个限制,这在其网站16MB上的手册中有介绍。我在尝试导入记录时多次达到此限制。如何通过查询获取文档列表的大小?当然,此代码将在计算大小之前获取文档。这不会返回good大小:(…但这是:如何获取Object.bsonsize,什么是import或required语句?对于错过它的任何其他人,您必须使用
findOne
而不是find
这正是我要查找的内容,但它不工作可能与我的mongo版本有关。当前版本是3.4?任何其他获取TypeError:Object.bsonsize的人都是not函数
?你有没有在mongo shell中尝试过?它的工作:正确的标签应该是'KiB':Math.round(size/(1024)),'MiB':Math.round(size/(1024*1024))
(或'kB':Math.round(size/(1000)),'MB':Math.round(size/(1000*1000))
试着解释你的答案。
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)');
});
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);
});
db.test.aggregate([
{
"$project": {
"name": 1,
"object_size": { "$bsonSize": "$$ROOT" }
}
}
])