sql >> Database >  >> NoSQL >> MongoDB

$strLenBytes versus $strLenCP in MongoDB:wat is het verschil?

MongoDB bevat de $strLenBytes en $strLenCP operators in zijn aggregatiepijplijnraamwerk. Deze operators doen iets vergelijkbaars, maar iets anders. In sommige gevallen zullen beide exact hetzelfde resultaat opleveren, terwijl in andere gevallen de resultaten zullen verschillen.

Hier is een kort overzicht van het verschil tussen deze twee operators.

Het verschil

Hier is een definitie van elke operator:

  • $strLenBytes geeft het aantal UTF-8 gecodeerde bytes in de opgegeven tekenreeks
  • $strLenCP retourneert het aantal UTF-8 codepunten in de opgegeven tekenreeks.

Let op het verschil in vetgedrukte letters. Men retourneert het aantal bytes , de andere retourneert het aantal codepunten .

Bij het werken met strings in het Engels is het aantal bytes meestal gelijk aan het aantal codepunten. Elk codepunt gebruikt één byte.

Maar als u met andere talen werkt die een ander Unicode-blok gebruiken, kan het zijn dat het aantal bytes toeneemt tot twee of drie bytes. Dit geldt ook bij het werken met andere Unicode-codepunten zoals symbolen, emoji, enz. In sommige gevallen kan een enkel teken 4 bytes gebruiken.

Voorbeeld

Stel dat we een verzameling hebben met de naam unicode met de volgende documenten:

{ "_id" : 1, "data" : "é" }
{ "_id" : 2, "data" : "©" }
{ "_id" : 3, "data" : "℘" }

En laten we nu beide $strLenBytes . toepassen en $strLenCP naar het gegevensveld:

db.unicode.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            strLenCP: { $strLenCP: "$data" },
            strLenBytes: { $strLenBytes: "$data" }
          }
     }
   ]
)

Resultaat:

{ "data" : "é", "strLenCP" : 1, "strLenBytes" : 2 }
{ "data" : "©", "strLenCP" : 1, "strLenBytes" : 2 }
{ "data" : "℘", "strLenCP" : 1, "strLenBytes" : 3 }

We kunnen zien dat alle tekens slechts één codepunt gebruiken, maar het eerste document gebruikt twee bytes en de andere twee documenten gebruiken elk drie bytes.

Engelse karakters

Stel dat we een verzameling hebben met de naam english met de volgende documenten:

{ "_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" }

En laten we nu beide $strLenBytes . toepassen en $strLenCP naar het gegevensveld:

db.english.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            strLenCP: { $strLenCP: "$data" },
            strLenBytes: { $strLenBytes: "$data" }
          }
     }
   ]
)

Resultaat:

{ "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 }

In dit geval gebruiken alle tekens één codepunt en elk één byte.

Thaise tekens

Hier is een voorbeeld dat Thaise karakters gebruikt om aan te tonen dat niet alle talen één byte per codepunt gebruiken.

Stel dat we een verzameling hebben met de naam thai met de volgende documenten:

{ "_id" : 1, "data" : "ไม้เมือง" }
{ "_id" : 2, "data" : "ไ" }
{ "_id" : 3, "data" : "ม้" }
{ "_id" : 4, "data" : "เ" }
{ "_id" : 5, "data" : "มื" }
{ "_id" : 6, "data" : "อ" }
{ "_id" : 7, "data" : "ง" }

Dit is wat er gebeurt als we beide $strLenBytes . toepassen en $strLenCP naar het gegevensveld:

db.thai.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            strLenCP: { $strLenCP: "$data" },
            strLenBytes: { $strLenBytes: "$data" }
          }
     }
   ]
)

Resultaat:

{ "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 }

  1. Combineer volledige tekst met andere index

  2. Journaling beheren in MongoDB

  3. Mongodb $lookup Werkt niet met _id

  4. Verificatie tijdens verbinding met MongoDB-serverinstantie met Java