Definición
$substrBytesDevuelve la subcadena de una string. La subcadena comienza con el carácter en el índice de bytes UTF-8 especificado (comenzando en cero) en la string y continúa durante el número de bytes especificado.
$substrBytestiene la siguiente sintaxis de expresión de operador:{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] } CampoTipoDescripciónstring expressionstring
La string de la que se extraerá la subcadena.
string expressionpuede ser cualquier expresión válida, siempre que se resuelva en una string. Para obtener más información sobre expresiones, consulte Expresiones.Si el argumento se resuelve en un valor de
nullo se refiere a un campo que no existe, devuelve una cadena$substrBytesvacía.Si el argumento no se resuelve en una cadena o
nullni hace referencia a un campo faltante, devuelve un$substrByteserror.byte indexNúmero
Indica el punto de partida de la subcadena.
byte indexpuede ser cualquier expresión válida siempre que se resuelva en un número entero no negativo o en un número que pueda representarse como un número entero (como 2.0).byte indexno puede hacer referencia a un índice de inicio que se encuentre en medio de un carácter UTF-8 de varios bytes.byte countNúmero
Puede ser cualquier expresión válida siempre que se resuelva en un número entero no negativo que pueda representarse como un número entero (como 2.0).
byte countno puede dar como resultado un índice final que esté en medio de un carácter UTF-8.
Comportamiento
El operador utiliza los índices de $substrBytes los8 bytes codificados en UTF-, donde cada punto de código, o carácter, puede utilizar entre uno y cuatro bytes para la codificación.
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.
Es importante tener en cuenta el contenido en el string expression porque proporcionar un byte index o byte count ubicado en medio de un carácter UTF-8 resultará en un error.
$substrBytes se diferencia de $substrCP en que cuenta los bytes $substrBytes $substrCP de cada carácter, mientras que cuenta los puntos de código, o caracteres, independientemente de cuántos bytes utilice un carácter.
Ejemplo | Resultados | ||
|---|---|---|---|
| | ||
| | ||
| | ||
| | ||
| Errores con mensaje:
| ||
| Errores con mensaje:
|
Ejemplo
Conjunto de Caracteres de Un Solo Byte
Considere una colección inventory con los siguientes documentos:
db.inventory.insertMany( [ { _id: 1, item: "ABC1", quarter: "13Q1", description: "product 1" }, { _id: 2, item: "ABC2", quarter: "13Q4", description: "product 2" }, { _id: 3, item: "XYZ1", quarter: "14Q2", description: null } ] )
La siguiente operación utiliza el operador para separar $substrBytes el quarter valor (que contiene solo caracteres US-ASCII de un solo byte) en un yearSubstring y quarterSubstring un. El quarterSubstring campo representa el resto de la cadena a partir del byte index especificado que sigue yearSubstring al. Se calcula restando el byte index de la longitud de la cadena $strLenBytes usando.
db.inventory.aggregate( [ { $project: { item: 1, yearSubstring: { $substrBytes: [ "$quarter", 0, 2 ] }, quarterSubstring: { $substrBytes: [ "$quarter", 2, { $subtract: [ { $strLenBytes: "$quarter" }, 2 ] } ] } } } ] )
La operación devuelve los siguientes resultados:
{ _id: 1, item: "ABC1", yearSubstring: "13", quarterSubstring: "Q1" } { _id: 2, item: "ABC2", yearSubstring: "13", quarterSubstring: "Q4" } { _id: 3, item: "XYZ1", yearSubstring: "14", quarterSubstring: "Q2" }
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: "寿司sushi" } ] )
La siguiente operación utiliza el operador $substrBytes para crear una menuCode de tres bytes a partir del valor name:
db.food.aggregate( [ { $project: { "name": 1, "menuCode": { $substrBytes: [ "$name", 0, 3 ] } } } ] )
La operación devuelve los siguientes resultados:
{ _id: 1, name: "apple", menuCode: "app" } { _id: 2, name: "banana", menuCode: "ban" } { _id: 3, name: "éclair", menuCode: "éc" } { _id: 4, name: "hamburger", menuCode: "ham" } { _id: 5, name: "jalapeño", menuCode: "jal" } { _id: 6, name: "pizza", menuCode: "piz" } { _id: 7, name: "tacos", menuCode: "tac" } { _id: 8, name: "寿司sushi", menuCode: "寿" }