MongoDB, le $strLenCP
L'opérateur de pipeline d'agrégation renvoie le nombre de points de code UTF-8 dans la chaîne spécifiée.
Le $strLenCP
l'opérateur est différent du $strLenBytes
opérateur qui renvoie le nombre d'octets dans la chaîne.
Exemple
Supposons que nous ayons une collection appelée english
avec les documents suivants :
{ "_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" }
Nous pouvons appliquer $strLenCP
au champ de données dans ces documents :
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Résultat :
{ "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 }
Nous pouvons voir que le mot entier utilise 8 points de code et que chaque caractère utilise un point de code.
Caractères thaïlandais
Voici un exemple qui utilise des caractères thaïlandais, qui font 3 octets chacun, mais n'utilisent qu'un seul point de code.
Nous avons une collection appelée thai
avec les documents suivants :
{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "data" :"§" }
Et voici ce qui se passe lorsque nous appliquons $strLenCP
à ces documents :
db.thai.aggregate( [ { $project :{ _id :0, données :1, résultat :{ $strLenCP :"$data" } } } ])
Résultat :
{ "data" :"ไม้เมือง", "result" :8 }{ "data" :"ไ", "result" :1 }{ "data" :"ม้", "result" :2 }{ "data" :"เ", "result" :1 }{ "data" :"มื", "result" :2 }{ "data" :"อ", "result" :1 }{ "data" :" §", "résultat" :1 }
Deux de ces caractères ont été modifiés à l'aide de signes diacritiques, ce qui entraîne le renvoi de 2 points de code. Ces caractères renvoient 6 octets lors de l'utilisation de $strLenBytes
opérateur.
Autres personnages
Supposons que nous ayons une collection appelée other
avec les documents suivants :
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Et appliquons
$strLenCP
à ces documents :db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
{ "data" :"é", "result" :1 }{ "data" :"©", "result" :1 }{ "data" :"℘", "result" :1 }Chacun de ces caractères utilise un seul point de code (même si ces caractères utilisent plus d'un octet).
Le caractère espace utilise un point de code. Deux espaces utilisent donc 2 points de code, et ainsi de suite.
Supposons que nous ayons les documents suivants :
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }Et on applique
$strLenCP
à ces documents :db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
{ "data" :" ", "result" :1 }{ "data" :" ", "result" :2 }Chaînes vides
Les chaînes vides renvoient
0
.Voici un document avec une chaîne vide :
{ "_id" :6, "data" :"" }Et voici ce qui se passe lorsque nous appliquons
$strLenCP
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
{ "data" :"", "result" :0 }Type de données incorrect
Passer le mauvais type de données entraîne une erreur.
Supposons que nous ayons le document suivant :
{ "_id" :7, "données" :123 }Le champ de données
field
contient un nombre.Appliquons
$strLenCP
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
exception non détectée :erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenCP nécessite un argument de chaîne, trouvé :double", "code" :34471, "codeName" :"Location34471"} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639 :[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1Valeurs nulles
Fournir
null
entraîne également une erreur.Supposons que nous ayons le document suivant :
{ "_id" :8, "data" :null }Le champ de données
field
contientnull
.Appliquons
$strLenCP
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
Erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenCP requiert un argument de chaîne, trouvé :null", "code" :34471, "codeName" :"Location34471"} :échec de l'agrégat :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1Champs manquants
En continuant avec le thème de la production d'erreurs, la spécification d'un champ inexistant produit également une erreur.
Documents :
{ "_id" :9 }Appliquer
$strLenCP
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenCP: "$data" } } } ] )
Résultat :
Erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenCP requiert un argument de chaîne, trouvé :manquant", "code" :34471, "codeName" :"Location34471"} :échec de l'agrégat :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1