当前位置: 首页 > 知识库问答 >
问题:

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

李景天
2023-03-14

我遇到了mongo的一个奇怪行为,我想澄清一下
我的要求很简单:我想获得集合中单个文档的大小。我找到了两种可能的解决方案:

  • 反对。bsonsize—返回字节大小的javascript方法

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

>

  • 我创建了一个新的数据库“test”,并输入了一个只有一个属性的简单文档:type:“auto”

    db.test.insert({type:"auto"})
    

    stats()函数调用的输出:db。测验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函数调用的输出:对象。bsonsize(db.test.find({test:“auto”}))

    481
    
  • 共有3个答案

    贡可人
    2023-03-14

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

    这就是db的输出之间存在差异的原因。测验stats()对象。b大小(…)

    要获得文档的确切大小(以字节为单位),请坚持使用对象。bsonsize()函数。

    陆文康
    2023-03-14

    如果你有版本

    您可以使用$bsonsize:

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

    如果你有版本

    您可以使用此脚本获取实际大小:**

    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这样的图形用户界面可以将其制表!

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

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

    上官兴昌
    2023-03-14

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

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

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

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

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

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

     类似资料:
    • 我是新的MongoDB,并试图从数据库检索单个文档的大小。 数据库名为“”集合名为“” 我试过: 我也尝试过: 但它只返回。如何获取文档的大小?非常感谢。

    • 问题内容: 我搜索了这个问题,但找不到任何有用的答案。我想获取文档中每个单词的总数,例如,我的索引中有一些推文,并且有一条推文中写着这样的内容:“这里太无聊了,我想去我的家,甜蜜的家”。查询应返回如下响应: 有可能这样做吗? 问题答案: 您正在寻找利用分析仪的。这样做时,您可以定义所需的任何分析器,即阻止分析器将单词转换为根/普通形式。查看文档以获取更多详细信息。 在: 出:

    • 我正在用db.coll.find拿一份文件。我想得到文件的大小字节使用nodejs只有mongo本地driver.can可能吗?

    • 本文向大家介绍如何在MongoDB中获得不同的子文档字段值列表?,包括了如何在MongoDB中获得不同的子文档字段值列表?的使用技巧和注意事项,需要的朋友参考一下 若要获取不同的子文档字段值列表,可以使用dot(。)。语法如下- 为了理解这个概念,让我们用文档创建一个集合。使用文档创建集合的查询如下- 在method的帮助下显示集合中的所有文档。查询如下- 以下是输出- 这是获取子文档字段值的唯一

    • 是否可以在MongoDB中找到最大的文档大小? 显示的是平均大小,这并不具有代表性,因为在我的例子中,大小可能会有很大差异。

    • 我正在使用 azure cosmos DB 充当 MongoDB 版本 4.0.0.我需要使用蒙哥数据库 API 从 Azure Cosmos DB 获取 N 个随机文档。我尝试过使用$sample运算符,但每次我查询时,它都会以相同的顺序为我提供文档。 无论我运行这个查询多少次,我都会从集合中得到相同的文档。