MongoDB, il $strLenBytes
l'operatore della pipeline di aggregazione restituisce il numero di byte con codifica UTF-8 nella stringa specificata.
Ogni carattere in una stringa può contenere un numero diverso di byte, a seconda del carattere utilizzato. Il $strLenBytes
l'operatore può capire quanti byte contiene ogni carattere e restituire il risultato corretto per l'intera stringa.
Esempio
Supponiamo di avere una collezione chiamata english
con i seguenti documenti:
{ "_id" : 1, "data" : "Maimuang" } { "_id" : 2, "data" : "M" } { "_id" : 3, "data" : "a" } { "_id" : 4, "data" : "i" } { "_id" : 5, "data" : "m" } { "_id" : 6, "data" : "u" } { "_id" : 7, "data" : "a" } { "_id" : 8, "data" : "n" } { "_id" : 9, "data" : "g" }
Possiamo applicare $strLenBytes
al campo dati in quei documenti:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
{ "data" : "Maimuang", "result" : 8 } { "data" : "M", "result" : 1 } { "data" : "a", "result" : 1 } { "data" : "i", "result" : 1 } { "data" : "m", "result" : 1 } { "data" : "u", "result" : 1 } { "data" : "a", "result" : 1 } { "data" : "n", "result" : 1 } { "data" : "g", "result" : 1 }
Possiamo vedere che l'intera parola è di 8 byte e ogni carattere è di 1 byte ciascuno.
Personaggi tailandesi
Ecco un esempio che utilizza caratteri tailandesi, che sono 3 byte ciascuno.
Abbiamo una collezione chiamata thai
con i seguenti documenti:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
Ed ecco cosa succede quando applichiamo $strLenBytes
a quei documenti:
db.thai.aggregate( [ { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Risultato:
{ "data" : "ไม้เมือง", "result" : 24 } { "data" : "ไ", "result" : 3 } { "data" : "ม้", "result" : 6 } { "data" : "เ", "result" : 3 } { "data" : "มื", "result" : 6 } { "data" : "อ", "result" : 3 } { "data" : "ง", "result" : 3 }
Due di questi caratteri sono stati modificati utilizzando segni diacritici, che hanno come risultato la restituzione di 6 byte.
Altri personaggi
Supponiamo di avere una collezione chiamata other
con i seguenti documenti:
{ "_id" : 1, "data" : "é" } { "_id" : 2, "data" : "©" } { "_id" : 3, "data" : "℘" }
E applichiamo $strLenBytes
a quei documenti:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
{ "data" : "é", "result" : 2 } { "data" : "©", "result" : 2 } { "data" : "℘", "result" : 3 }
I primi due caratteri sono 2 byte e il terzo è 3 byte. Il numero di byte dipende dal carattere. Alcuni caratteri possono utilizzare 4 byte.
Il carattere spazio utilizza un byte. Due caratteri spazio utilizzano quindi 2 byte e così via.
Supponiamo di avere i seguenti documenti:
{ "_id" : 4, "data" : " " } { "_id" : 5, "data" : " " }
E applichiamo $strLenBytes
a quei documenti:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
{ "data" : " ", "result" : 1 } { "data" : " ", "result" : 2 }
Stringhe vuote
Le stringhe vuote restituiscono 0
.
Ecco un documento con una stringa vuota:
{ "_id" : 6, "data" : "" }
Ed ecco cosa succede quando applichiamo $strLenBytes
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
{ "data" : "", "result" : 0 }
Tipo di dati errato
Il passaggio del tipo di dati errato genera un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 7, "data" : 123 }
Il field
dei dati contiene un numero.
Applichiamo $strLenBytes
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: double", "code" : 34473, "codeName" : "Location34473" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Valori Nulli
Fornendo null
genera anche un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 8, "data" : null }
Il field
dei dati contiene null
.
Applichiamo $strLenBytes
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: null", "code" : 34473, "codeName" : "Location34473" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Campi mancanti
Continuando con il tema della produzione di errori, anche specificare un campo inesistente produce un errore.
Documento:
{ "_id" : 9 }
Applica $strLenBytes
:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Risultato:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenBytes requires a string argument, found: missing", "code" : 34473, "codeName" : "Location34473" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1