MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$strLenBytes vs $strLenCP dans MongoDB :Quelle est la différence ?

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 }