Definición
$strLenBytesDevuelve el número de bytes codificados en UTF-8 en la string especificada.
$strLenBytestiene lo siguiente Sintaxis de expresión de operador:{ $strLenBytes: <string expression> } El argumento puede ser cualquier expresión válida siempre que resuelva a una string. Para obtener más información sobre las expresiones, consulta Expresiones.
Si el argumento se resuelve en un valor de
nullo hace referencia a un campo que falta,$strLenBytesretorna un error.
Comportamiento
El operador $strLenBytes cuenta el número de bytes codificados en UTF-8 en un string, donde cada carácter puede usar entre uno y cuatro bytes.
Por ejemplo, los caracteres US-ASCII se codifican usando un byte. Los caracteres con marcas diacríticas y caracteres alfabéticos latinos adicionales (caracteres latinos fuera del alfabeto inglés) se codifican utilizando dos bytes. Los caracteres chinos, japoneses y coreanos generalmente requieren tres bytes, mientras que otros planos de Unicode (emojis, símbolos matemáticos, etc.) requieren cuatro bytes.
El $strLenBytes operador difiere del $strLenCP operador que cuenta los puntos de código
en la cadena especificada, independientemente de cuántos bytes utilice cada carácter.
Ejemplo | Resultados | notas | |
|---|---|---|---|
|
| Cada carácter se codifica utilizando un byte. | |
|
| Cada carácter se codifica utilizando un byte. | |
|
| Cada carácter se codifica utilizando un byte. | |
|
|
| |
|
| Las cadenas vacías retornan 0. | |
|
|
| |
|
| Cada carácter se codifica utilizando tres bytes. |
Ejemplo
Juego de caracteres de un solo byte y de varios bytes
Crea una colección food con los siguientes documentos:
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" : "寿司" } ] )
La siguiente operación utiliza el operador $strLenBytes para calcular el length de cada valor name:
db.food.aggregate( [ { $project: { "name": 1, "length": { $strLenBytes: "$name" } } } ] )
La operación devuelve los siguientes resultados:
{ "_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 }
Los documentos con _id: 3 y _id: 5 contienen cada uno un carácter diacrítico (é y ñ respectivamente) que requiere dos bytes para codificarse. El documento con _id: 8 contiene dos caracteres japoneses que se codifican utilizando tres bytes cada uno. Esto hace que la length sea mayor que el número de caracteres en name para los documentos con _id: 3, _id: 5 y _id: 8.