sql >> Databáze >  >> NoSQL >> MongoDB

$strLenBytes vs $strLenCP v MongoDB:Jaký je rozdíl?

MongoDB obsahuje $strLenBytes a $strLenCP operátorů v rámci svého agregačního kanálu. Tito operátoři dělají podobnou, ale trochu jinou věc. V některých případech oba vrátí přesně stejný výsledek, zatímco v jiných případech se výsledky budou lišit.

Zde je rychlý přehled rozdílů mezi těmito dvěma operátory.

Rozdíl

Zde je definice každého operátoru:

  • $strLenBytes vrátí počet bajtů kódovaných UTF-8 v zadaném řetězci
  • $strLenCP vrátí počet bodů kódu UTF-8 v zadaném řetězci.

Všimněte si rozdílu v tučném písmu. Jeden vrátí počet bajtů , druhý vrátí počet bodů kódu .

Při práci s řetězci v angličtině bude počet bajtů obvykle stejný jako počet bodů kódu. Každý bod kódu bude používat jeden bajt.

Ale při práci s jinými jazyky, které používají jiný blok Unicode, můžete zjistit, že se počet bajtů zvýší na dva nebo tři bajty. To platí také při práci s jinými body kódu Unicode, jako jsou symboly, emotikony atd. V některých případech může jeden znak používat 4 bajty.

Příklad

Předpokládejme, že máme kolekci nazvanou unicode s následujícími dokumenty:

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

A nyní použijeme oba $strLenBytes a $strLenCP do datového pole:

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

Výsledek:

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

Vidíme, že všechny znaky používají pouze jeden kódový bod, ale první dokument používá dva bajty a další dva dokumenty používají každý tři bajty.

Anglické znaky

Předpokládejme, že máme kolekci nazvanou english s následujícími dokumenty:

{ "_id" :1, "data" :"Rychlý pes" }{ "_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" }

A nyní použijeme oba $strLenBytes a $strLenCP do datového pole:

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

Výsledek:

{ "data" :"Rychlý pes", "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 }

V tomto případě všechny znaky používají jeden kódový bod a každý jeden bajt.

Thajské znaky

Zde je příklad, který používá thajské znaky k demonstraci toho, že ne všechny jazyky používají jeden bajt na kódový bod.

Předpokládejme, že máme kolekci nazvanou thai s následujícími dokumenty:

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

Zde je to, co se stane, když použijeme oba $strLenBytes a $strLenCP do datového pole:

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

Výsledek:

{ "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. Jak aktualizuji dokument Mongo po jeho vložení?

  2. mongoose :vyhledejte data smyčkováním na řadě modelů

  3. Nainstalujte CouchDB na Debian 9

  4. Chyba:Žádná podpora unixového socketu v systému Windows připojujícím mongodb