Mongo =获取单个文档的大小

use*_*763 68 javascript document objectsize mongodb objectid

我遇到了一个奇怪的mongo行为,我想稍微澄清一下......
我的请求很简单:我想在集合中获得单个文档的大小.我发现了两种可能的解决方

  • Object.bsonsize - 一些应该以字节为单位返回大小的javascript方法
  • db.collection.stats() - 其中有一行'avgObjSize',它在数据上产生一些"聚合"(平均)大小视图.它只代表单个文档的平均大小.

  • 当我使用一个文档创建测试集合时,两个函数都返回不同的值.这怎么可能?
    是否存在其他方法来获取mongo文档的大小?

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

  1. 我创建了新的数据库'test'并输入只有一个属性的简单文档:type:"auto"

    db.test.insert({type:"auto"})
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    }

  3. bsonsize函数调用的输出:Object.bsonsize(db.test.find({test:"auto"}))

    481
    
    Run Code Online (Sandbox Code Playgroud)

use*_*763 151

我找到了解决方案.在之前调用的Object.bsonsize中, mongo返回了CURSOR的大小,而不是文档本身.

正确的方法是使用此命令:

Object.bsonsize(db.test.findOne({type:"auto"}))
Run Code Online (Sandbox Code Playgroud)

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

  • 如何通过查询获取文档列表的大小? (4认同)
  • 如何获取Object.bsonsize,import或required语句是什么? (4认同)
  • 对于其他错过的人,**您必须使用`findOne`而不是`find` ** (4认同)

Kon*_*kov 27

由于记录填充机制,文档在集合中占用的有效空间量将超过文档的大小.

这就是为什么db.test.stats()和的输出之间存在差异的原因Object.bsonsize(..).

要获得文档的确切大小(以字节为单位),请坚持使用该Object.bsonsize()功能.

  • 使用哪个大小来强制执行mongDB文档大小限制?Object.bsonsize()? (4认同)

Lib*_*eur 25

我建议使用这个脚本来获得真实的大小.

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)');
});
Run Code Online (Sandbox Code Playgroud)

注意:如果您的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);
});
Run Code Online (Sandbox Code Playgroud)

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

来源:https://stackoverflow.com/a/16957505/3933634

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

  • 还有其他人收到“TypeError: Object.bsonsize is not a function”吗? (5认同)

Ash*_*shh 5

使用 mongodb 4.4(即将推出),您可以使用bsonSize运算符来获取文档大小。

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)