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 }