MongoDB inclut le $strLenBytes
et $strLenCP
opérateurs dans son cadre de pipeline d'agrégation. Ces opérateurs font une chose similaire mais légèrement différente. Dans certains cas, les deux renverront exactement le même résultat, tandis que dans d'autres cas, les résultats seront différents.
Voici un bref aperçu de la différence entre ces deux opérateurs.
La différence
Voici une définition de chaque opérateur :
$strLenBytes
renvoie le nombre d'octets encodés UTF-8 dans la chaîne spécifiée$strLenCP
renvoie le nombre de points de code UTF-8 dans la chaîne spécifiée.
Remarquez la différence en caractères gras. On renvoie le nombre octets , l'autre renvoie le nombre de points de code .
Lorsque vous travaillez avec des chaînes en anglais, le nombre d'octets sera généralement le même que le nombre de points de code. Chaque point de code utilisera un octet.
Mais lorsque vous travaillez avec d'autres langages qui utilisent un bloc Unicode différent, vous pouvez constater que le nombre d'octets augmente à deux ou trois octets. Cela est également vrai lorsque vous travaillez avec d'autres points de code Unicode tels que des symboles, des emoji, etc. Dans certains cas, un seul caractère peut utiliser 4 octets.
Exemple
Supposons que nous ayons une collection appelée unicode
avec les documents suivants :
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Et maintenant, appliquons les deux
$strLenBytes
et$strLenCP
au champ de données :db.unicode.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Résultat :
{ "data" :"é", "strLenCP" :1, "strLenBytes" :2 }{ "data" :"©", "strLenCP" :1, "strLenBytes" :2 }{ "data" :"℘", "strLenCP" :1, "strLenBytes" :3 }Nous pouvons voir que tous les caractères utilisent un seul point de code, mais le premier document utilise deux octets et les deux autres documents utilisent chacun trois octets.
Caractères anglais
Supposons que nous ayons une collection appelée
english
avec les documents suivants :{ "_id" :1, "data" :"Fast dog" }{ "_id" :2, "data" :"F" }{ "_id" :3, "data" :"a" }{ "_id" :4, "data" :"s" }{ "_id" :5, "data" :"t" }{ "_id" :6, "data" :" " }{ "_id" :7, "data" :"d" }{ "_id" :8, "data" :"o" }{ "_id" :9, "data" :"g" }Et maintenant, appliquons les deux
$strLenBytes
et$strLenCP
au champ de données :db.english.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Résultat :
{ "data" :"Fast dog", "strLenCP" :8, "strLenBytes" :8 }{ "data" :"F", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"a", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"s", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"t", "strLenCP" :1, "strLenBytes" :1 }{ "data" :" ", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"d", "strLenCP" :1, "strLenBytes" :1 } { "data" :"o", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"g", "strLenCP" :1, "strLenBytes" :1 }Dans ce cas, tous les caractères utilisent un point de code et un octet chacun.
Caractères thaïlandais
Voici un exemple qui utilise des caractères thaïlandais pour démontrer que toutes les langues n'utilisent pas un octet par point de code.
Supposons que nous ayons 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" :"§" }Voici ce qui se passe lorsque nous appliquons à la fois
$strLenBytes
et$strLenCP
au champ de données :db.thai.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Résultat :
{ "data" :"ไม้เมือง", "strLenCP" :8, "strLenBytes" :24 }{ "data" :"ไ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"ม้", "strLenCP" :2, "strLenBytes" :6 }{ "data" :"เ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"มื", "strLenCP" :2, "strLenBytes" :6 }{ "data" :"อ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"ง", "strLenCP" :1, "strLenBytes" :3 }