MongoDB聚合运算符:$binarySize

$binarySize聚合运算符返回给定字符串或二进制数据的字节数。

语法

js 复制代码
{ $binarySize: <string or binData> }

使用

<string or bindData>可以是任何能够被解析为字符串和二进制数据的表达式;如果表达式解析为null,则$binarySize也返回null;如果表示解析为其他数据类型的值则报错。

当参数为字符串类型时,$binarySize运算符采用UTF-8编码字节对字符串进行统计,单个字符长度可能为1到4个字节。

例如,US-ASCII 字符用一个字节编码。带有变音标记的字符和其他拉丁字母字符(即英文字母以外的拉丁字符)使用两个字节编码。中文、日文和韩文字符通常需要三个字节,其他统一码平面(表情符号、数学符号等)需要四个字节。如下表:

表达式 长度 说明
{ $binarySize: "abcde" } 5 每个字符占用1字节
{ $binarySize: "Hello World!" } 每个字符占用1字节
{ $binarySize: "cafeteria" } 9 每个字符占用1字节
{ $binarySize: "cafétéria" } 11 é字符占用2字节
{ $binarySize: "" } 0 空字符串返回0
{ $binarySize: "$€λG" } 7 占用3字节,λ占用2字节
{ $binarySize: "寿司" } 6 每个字符占用3字节

举例

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

js 复制代码
db.images.insertMany([
  { _id: 1, name: "cat.jpg", binary: new BinData(0, "OEJTfmD8twzaj/LPKLIVkA==")},
  { _id: 2, name: "big_ben.jpg", binary: new BinData(0, "aGVsZmRqYWZqYmxhaGJsYXJnYWZkYXJlcTU1NDE1Z2FmZCBmZGFmZGE=")},
  { _id: 3, name: "tea_set.jpg", binary: new BinData(0, "MyIRAFVEd2aImaq7zN3u/w==")},
  { _id: 4, name: "concert.jpg", binary: new BinData(0, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=")},
  { _id: 5, name: "empty.jpg", binary: new BinData(0, "") }
])

统计二进制字段长度

下面的聚合命令使用$project对集合文档进行重塑,输出name字段并使用$binarySize返回文档中binary字段的字节数,操作返回下面的结果:

json 复制代码
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 }
{ "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 }
{ "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 }
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }
{ "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 }

查找最大的二进制字段

下面的聚合操作返回二进制字段最大的图片:

js 复制代码
db.images.aggregate([
   // 阶段1
   { $project: { name: "$name", imageSize: { $binarySize: "$binary" } }  },
   // 阶段2
   { $sort: { "imageSize" : -1 } },
   // 阶段3
   { $limit: 1 }
])
阶段1

使用$project阶段和$binarySize运算符,输出文件名name和图片大小imageSize字段:

json 复制代码
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 }
{ "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 }
{ "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 }
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }
{ "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 }
阶段2

使用$sort按照imageSize对文档由大到小进行排序:

json 复制代码
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }
{ "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 }
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 }
{ "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 }
{ "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 }
阶段3

使用limit只输出排序后第一个文档的内容:

json 复制代码
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }
相关推荐
ImomoTo3 小时前
HarmonyOS学习(十三)——数据管理(二) 关系型数据库
数据库·学习·harmonyos·arkts·鸿蒙
机器视觉知识推荐、就业指导5 小时前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
jnrjian5 小时前
export rman 备份会占用buff/cache 导致内存压力
数据库·oracle
isNotNullX6 小时前
一文解读OLAP的工具和应用软件
大数据·数据库·etl
小诸葛的博客8 小时前
pg入门1——使用容器启动一个pg
数据库
大熊程序猿9 小时前
python 读取excel数据存储到mysql
数据库·python·mysql
落落落sss9 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
jnrjian9 小时前
Oracle 启动动态采样 自适应执行计划
数据库·oracle
lamb张9 小时前
MySQL锁
数据库·mysql