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 }
相关推荐
Ai 编码助手1 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员1 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻1 小时前
MySQL排序查询
数据库·mysql
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
荒川之神2 小时前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师2 小时前
Oracle 23AI创建示例库
数据库·oracle
小白学大数据2 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
time never ceases2 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle