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

新手上路,请多包涵

我遇到了 mongo 的奇怪行为,我想澄清一下……

我的要求很简单:我想在集合中获取单个文档的大小。我找到了两种可能的解决方案:

  • Object.bsonsize - 一些应该以字节为单位返回大小的 javascript 方法
  • db.collection.stats() - 其中有一行 ‘avgObjSize’ 生成一些数据的“聚合”(平均)大小视图。它只是代表单个文档的平均大小。

当我只用一个文档创建测试集合时,两个函数返回不同的值。这怎么可能?

是否存在其他方法来获取 mongo 文档的大小?

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

  1. 我创建了新数据库“test”并输入了只有一个属性的简单文档:type:“auto”
    db.test.insert({type:"auto"})

  1. 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

}
  1. bsonsize 函数调用的输出: Object.bsonsize(db.test.find({test:“auto”}))
    481

原文由 user1949763 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 844
2 个回答

在之前调用 Object.bsonsize() 时,Mongodb 返回游标的大小,而不是文档的大小。

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

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

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

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

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

原文由 user1949763 发布,翻译遵循 CC BY-SA 4.0 许可协议

最大文档大小 16 MiB( 来源


如果您的版本 >=4.4( $bsonSize 来源

 db.users.aggregate([
  {
    "$project": {
      "size_bytes": { "$bsonSize": "$$ROOT" },
      "size_KB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000] },
      "size_MB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000000] }
    }
  }
])


如果您的版本 <4.4( Object.bsonSize() 来源

您可以使用此脚本获取实际尺寸:

 db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1000))+'KB -> '+Math.round(size/(1000*1000))+'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/(1000)),
    'MB': Math.round(size/(1000*1000))
  };
  print(stats);
});

这也有返回 JSON 的优点,因此像 RoboMongo 这样的 GUI 可以将它制表!


编辑:感谢 @zAlbee 完成建议。

原文由 Liberateur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题