小工具知识网

当前位置: 首页 > 行业知识 > MongoDB聚合运算符:$bsonSize

行业知识

MongoDB聚合运算符:$bsonSize

2026-10-20 08:00:48 来源:互联网转载

文章目录

    • 语法
    • 用法
    • 举例
      • 返回文档大小
      • 返回集合中所有文档的合计大小
      • 返回指定字段最大的文档
        • 阶段1
        • 阶段2
        • 阶���3

          $bsonSize聚合运算符返回文档(如:bsontype对象)编码为BSON后的字节数,可以使用$bsonSize替代bsonSize()方法。

          ()

          语法

          { $bsonSize:  }

          参数可以是任何能够被解析为对象或null的表达式。

          用法

          • 如果参数是一个对象,表达式返回对象编码为BSON后的字节数
          • 如果参数为null,表达式返回null
          • 如果参数无法被解析为对象或null,则报错

            举例

            返回文档大小

            使用下面的命令创建employees集合:

            ()
             db.employees.insertMany([   {     "_id": 1,     "name": "Alice", "email": "alice@company.com", "position": "Software Developer",     "current_task": {       "project_id": 1,       "project_name": "Aggregation Improvements",       "project_duration": 5,       "hours": 20     }   },   {     "_id": 2,     "name": "Bob", "email": "bob@company.com", "position": "Sales",     "current_task": {       "project_id": 2,       "project_name": "Write Blog Posts",       "project_duration": 2,       "hours": 10,       "notes": "Progress is slow. Waiting for feedback."     }   },   {     "_id": 3,     "name": "Charlie", "email": "charlie@company.com", "position": "HR (On Leave)",     "current_task": null   },   {     "_id": 4,     "name": "Dianne", "email": "diane@company.com", "position": "Web Designer",     "current_task": {       "project_id": 3,       "project_name": "Update Home Page",       "notes": "Need to scope this project."     }   }]);

            下面的聚合输出两个字段:

            • name字段
            • object_size字段,使用$bsonSize返回文档的字节大小,其中$$ROOT变量引用的是管道当前处理的问题。
              db.employees.aggregate([  {    "$project": {      "name": 1,      "object_size": { $bsonSize: "$$ROOT" }    }  }])

              操作返回下面的结果:

              { "_id" : 1, "name" : "Alice", "object_size" : 222 }{ "_id" : 2, "name" : "Bob", "object_size" : 248 }{ "_id" : 3, "name" : "Charlie", "object_size" : 112 }{ "_id" : 4, "name" : "Dianne", "object_size" : 207 }

              返回集合中所有文档的合计大小

              下面的聚合管道返回employees集合中所有文档的大小合计:

              db.employees.aggregate([  {    "$group": {      "_id": null,      "combined_object_size": { $sum: { $bsonSize: "$$ROOT" } }    }  }])

              当指定$group阶段的_id为null或常量时,$group阶段将把所有的输入文档作为一个整体。

              该聚合操作使用$sum运算符对集合的每个文档的大小进行合并,$$ROOT变量引用管道处理的当前文档。

              操作返回下面的结果:

              { "_id" : null, "combined_object_size" : 789 }

              返回指定字段最大的文档

              下面的聚合管道返回集合中current_task字段字节数最多的文档:

              db.employees.aggregate([   // 阶段1   { $project: { name: "$name", task_object_size: { $bsonSize: "$current_task" } }  },   // 阶段2   { $sort: { "task_object_size" : -1 } },   // 阶段3   { $limit: 1 }])
              阶段1

              第一个阶段投影一下字段:

              • name字段
              • task_object_size字段,使用$bsonSize返回current_task字段文档的字节大小。

                该阶段输出下面的文档到下一阶段:

                { "_id" : 1, "name" : "Alice", "task_object_size" : 109 }{ "_id" : 2, "name" : "Bob", "task_object_size" : 152 }{ "_id" : 3, "name" : "Charlie", "task_object_size" : null }{ "_id" : 4, "name" : "Dianne", "task_object_size" : 99 }
                阶段2

                阶段2按照task_object_size字段,有大到小对文档进行排序,该阶段输出下面的文档到下一阶段:

                { "_id" : 2, "name" : "Bob", "task_object_size" : 152 }{ "_id" : 1, "name" : "Alice", "task_object_size" : 109 }{ "_id" : 4, "name" : "Dianne", "task_object_size" : 99 }{ "_id" : 3, "name" : "Charlie", "task_object_size" : null }
                阶段3

                阶段三对输出文档的数量进行限制,只返回排序后的第一个文档:

                { "_id" : 2, "name" : "Bob", "task_object_size" : 152 }

上一篇:浆果资源下载秘籍,安全无忧获取指南!

下一篇:为什么要有返回值?