$binarySize(聚合)
定义
$binarySize
返回给定字符串或二进制数据值内容的大小(字节)。
$binarySize
语法如下{ $binarySize: <string or binData> }
行为
$binarySize
的参数必须解析为以下之一
字符串,
二进制数据值,或者
null。
如果参数是字符串或二进制数据值,表达式返回参数的字节大小。
如果参数是null
,表达式返回null
。
如果参数解析为任何其他数据类型,$binarySize
将报错。
字符串大小计算
如果$binarySize
的参数是字符串,该运算符会计算字符串中UTF-8编码的字节数,其中每个字符可能使用一到四个字节。
例如,US-ASCII字符使用一个字节编码。带重音符号的字符和额外的拉丁字母字符(英文字母表之外的拉丁字符)使用两个字节编码。中文、日文和韩文字符通常需要三个字节,而其他Unicode平面(表情符号、数学符号等)需要四个字节。
考虑以下示例
示例 | 结果 | 说明 | |
---|---|---|---|
| 5 | 每个字符使用一个字节编码。 | |
| 12 | 每个字符使用一个字节编码。 | |
| 9 | 每个字符使用一个字节编码。 | |
| 11 | é 使用两个字节编码。 | |
| 0 | 空字符串返回0。 | |
| 7 | 欧元符号(€)使用三个字节进行编码。希腊字母λ(lambda)使用两个字节进行编码。 | |
| 6 | 每个字符都使用三个字节进行编码。 |
示例
在mongosh
中,创建一个名为images
的示例集合,包含以下文档
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, "") } ])
以下聚合操作projects
:
name字段
imageSize字段,使用
$binarySize
返回文档二进制字段的大小(以字节为单位)。
db.images.aggregate([ { $project: { "name": "$name", "imageSize": { $binarySize: "$binary" } } } ])
此操作返回以下结果
{ "_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 }
查找最大的二进制数据
以下管道返回二进制数据大小最大的图像
db.images.aggregate([ // First Stage { $project: { name: "$name", imageSize: { $binarySize: "$binary" } } }, // Second Stage { $sort: { "imageSize" : -1 } }, // Third Stage { $limit: 1 } ])
- 第一阶段
管道的第一阶段
projects
:name字段
imageSize字段,使用
$binarySize
返回文档二进制字段的大小(以字节为单位)。
此阶段将以下文档输出到下一阶段
{ "_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 } - 第二阶段
第二阶段
sorts
按imageSize降序排列文档。此阶段将以下文档输出到下一阶段
{ "_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 } - 第三阶段
第三阶段
limits
输出文档,仅返回按排序顺序出现的第一个文档{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }