MongoDB, le $strLenBytes
L'opérateur de pipeline d'agrégation renvoie le nombre d'octets encodés en UTF-8 dans la chaîne spécifiée.
Chaque caractère d'une chaîne peut contenir un nombre différent d'octets, selon le caractère utilisé. Le $strLenBytes
l'opérateur peut déterminer le nombre d'octets que contient chaque caractère et renvoyer le résultat correct pour toute 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 $strLenBytes
au champ de données dans ces documents :
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$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 est de 8 octets et chaque caractère est de 1 octet chacun.
Caractères thaïlandais
Voici un exemple qui utilise des caractères thaïlandais, qui font 3 octets chacun.
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 $strLenBytes
à ces documents :
db.thai.aggregate( [ { $project :{ _id :0, données :1, résultat :{ $strLenBytes :"$data" } } } ])
Résultat :
{ "data" :"ไม้เมือง", "result" :24 }{ "data" :"ไ", "result" :3 }{ "data" :"ม้", "result" :6 }{ "data" :"เ", "result" :3 }{ "data" :"มื", "result" :6 }{ "data" :"อ", "result" :3 }{ "data" :" §", "résultat" :3 }
Deux de ces caractères ont été modifiés à l'aide de signes diacritiques, ce qui entraîne le retour de 6 octets.
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
$strLenBytes
à ces documents :db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Résultat :
{ "data" :"é", "result" :2 }{ "data" :"©", "result" :2 }{ "data" :"℘", "result" :3 }Les deux premiers caractères font 2 octets et le troisième 3 octets. Le nombre d'octets dépend du caractère. Certains caractères peuvent utiliser 4 octets.
Le caractère espace utilise un octet. Deux caractères espace utilisent donc 2 octets, et ainsi de suite.
Supposons que nous ayons les documents suivants :
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }Et nous appliquons
$strLenBytes
à ces documents :db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$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
$strLenBytes
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$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
$strLenBytes
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Résultat :
Erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenBytes nécessite un argument de chaîne, trouvé :double", "code" :34473, "codeName" :"Location34473"} :é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: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
$strLenBytes
à ce document :db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Résultat :
exception non interceptée :erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenBytes nécessite un argument de chaîne, trouvé :null", "code" :34473, "codeName" :"Location34473"} :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: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
$strLenBytes
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Résultat :
Erreur :échec de la commande :{ "ok" :0, "errmsg" :"$strLenBytes nécessite un argument de chaîne, trouvé :manquant", "code" :34473, "codeName" :"Location34473"} :é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