MongoDB, il $strLenCP
l'operatore della pipeline di aggregazione restituisce il numero di punti di codice UTF-8 nella stringa specificata.
Il $strLenCP
l'operatore è diverso da $strLenBytes
operatore, che restituisce il numero di byte nella 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 $strLenCP
al campo dati in quei documenti:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 utilizza 8 punti di codice e ogni carattere utilizza un punto di codice.
Personaggi tailandesi
Ecco un esempio che utilizza caratteri tailandesi, che sono 3 byte ciascuno, ma utilizzano solo un punto di codice.
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 $strLenCP
a quei documenti:
db.thai.aggregate( [ { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Risultato:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
Due di questi caratteri sono stati modificati utilizzando segni diacritici, che si traducono in 2 punti di codice restituiti. Questi caratteri restituiscono 6 byte quando si utilizza $strLenBytes
operatore.
Altri personaggi
Supponiamo di avere una collezione chiamata other
con i seguenti documenti:
{ "_id" : 1, "data" : "é" } { "_id" : 2, "data" : "©" } { "_id" : 3, "data" : "℘" }
E applichiamo $strLenCP
a quei documenti:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Risultato:
{ "data" : "é", "result" : 1 } { "data" : "©", "result" : 1 } { "data" : "℘", "result" : 1 }
Ciascuno di questi caratteri utilizza un singolo punto di codice (anche se tali caratteri utilizzano più di un byte).
Il carattere spazio utilizza un punto di codice. Due caratteri spazio utilizzano quindi 2 punti di codice e così via.
Supponiamo di avere i seguenti documenti:
{ "_id" : 4, "data" : " " } { "_id" : 5, "data" : " " }
E applichiamo $strLenCP
a quei documenti:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 $strLenCP
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$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 $strLenCP
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Risultato:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: double", "code" : 34471, "codeName" : "Location34471" } : 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 $strLenCP
a quel documento:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Risultato:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: null", "code" : 34471, "codeName" : "Location34471" } : 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 $strLenCP
:
db.other.aggregate(
[
{ $match: { _id: { $in: [ 9 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Risultato:
Error: command failed: { "ok" : 0, "errmsg" : "$strLenCP requires a string argument, found: missing", "code" : 34471, "codeName" : "Location34471" } : 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