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

mum43rcc  于 2022-11-28  发布在  Go
关注(0)|答案(6)|浏览(568)

我遇到了一个奇怪的行为mongo和我想澄清一下...
我的要求很简单:我想得到一个大小的单一文件的集合。我发现两个可能的解决方案:

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

当我创建只有一个文档的测试集合时,两个函数都返回不同的值。这怎么可能呢?
是否存在其他方法来获取mongo文档的大小?
在这里,我提供了一些代码,我执行测试:
1.我创建了一个新的数据库'test',并输入了一个简单的文档,其中只有一个属性:类型:“自动”

db.test.insert({type:"auto"})
  1. 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函数调用输出:* 对象.bsonsize(数据库.测试.查找({测试:“自动”}))*
481
3bygqnnd

3bygqnnd1#

在前面的Object.bsonsize()调用中,Mongodb返回的是光标的大小,而不是文档的大小。
正确的方法是使用此命令:

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

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

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

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

rsaldnfx

rsaldnfx2#

最大文档大小16 MiB(源)
如果您的版本大于等于4.4($bsonSizesource

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建议完成。

ffx8fchx

ffx8fchx3#

由于Record Padding机制,文档在集合中占用的有效空间量将大于文档的大小。
这就是db.test.stats()Object.bsonsize(..)的输出之间存在差异的原因。
要获得文档的精确大小(以字节为单位),请使用Object.bsonsize()函数。

s6fujrry

s6fujrry4#

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

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])
plupiseo

plupiseo5#

bsonsize(db.test.findOne({type:“auto”}))它以字节为单位。

ars1skjm

ars1skjm6#

方法Object.bsonsize()仅在旧版mongo shell中可用。在新的mongosh中,必须使用包bsonmongocompat snippets

const BSON = require("bson");

BSON.calculateObjectSize({field: "value"})

BSON.calculateObjectSize(db.test.findOne())

相关问题