$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 }