$strLenBytes(聚合)
定义
$strLenBytes
版本 3.4 中的新增功能。
返回指定字符串中 UTF-8 编码的字节数。
{ $strLenBytes: <string expression> } 该参数可以是任何有效的表达式,只要它解析为字符串即可。 有关表达式的更多信息,请参阅表达式。
如果参数解析为
null
的值或指向缺失的字段,$strLenBytes
返回错误。
行为
$strLenBytes
操作符计算string中 UTF-8 编码的字节数,其中每个字符可能使用 1 到 4 个字节。
示例,US-ASCII 字符使用一个字节进行编码。 带有变音符号的字符和其他拉丁字母字符(英语字母表之外的拉丁字符)使用两个字节进行编码。 中文、日文和韩文字符通常需要三个字节,而其他平面的 unicode(表情符号、数学符号等)需要四个字节。
$strLenBytes
$strLenCP
操作符与 string操作符符不同,后者计算 代码点 在指定 中,无论每个字符使用多少字节。
例子 | 结果 | 注意 | |
---|---|---|---|
| 5 | 每个字符使用一个字节进行编码。 | |
| 12 | 每个字符使用一个字节进行编码。 | |
| 9 | 每个字符使用一个字节进行编码。 | |
| 11 | é 使用两个字节进行编码。 | |
| 0 | 空字符串返回 0。 | |
| 7 | € 使用三个字节进行编码。 λ 使用两个字节进行编码。 | |
| 6 | 每个字符使用三个字节进行编码。 |
例子
单字节和多字节字符集
使用以下文档创建 food
集合:
db.food.insertMany( [ { "_id" : 1, "name" : "apple" }, { "_id" : 2, "name" : "banana" }, { "_id" : 3, "name" : "éclair" }, { "_id" : 4, "name" : "hamburger" }, { "_id" : 5, "name" : "jalapeño" }, { "_id" : 6, "name" : "pizza" }, { "_id" : 7, "name" : "tacos" }, { "_id" : 8, "name" : "寿司" } ] )
以下操作使用$strLenBytes
操作符计算每个name
值的length
:
db.food.aggregate( [ { $project: { "name": 1, "length": { $strLenBytes: "$name" } } } ] )
操作返回以下结果:
{ "_id" : 1, "name" : "apple", "length" : 5 } { "_id" : 2, "name" : "banana", "length" : 6 } { "_id" : 3, "name" : "éclair", "length" : 7 } { "_id" : 4, "name" : "hamburger", "length" : 9 } { "_id" : 5, "name" : "jalapeño", "length" : 9 } { "_id" : 6, "name" : "pizza", "length" : 5 } { "_id" : 7, "name" : "tacos", "length" : 5 } { "_id" : 8, "name" : "寿司", "length" : 6 }
带有_id: 3
和_id: 5
的文档各包含一个变音符号(分别为é
和ñ
),需要两个字节进行编码。 带有_id: 8
的文档包含两个日文字符,每个字符使用三个字节进行编码。 对于具有_id: 3
、 _id: 5
和_id: 8
的文档,这使得length
大于name
中的字符数。