MongoDB, $strLenBytes
Operátor agregačního kanálu vrátí počet bajtů kódovaných UTF-8 v zadaném řetězci.
Každý znak v řetězci může obsahovat různý počet bajtů v závislosti na použitém znaku. $strLenBytes
operátor může zjistit, kolik bajtů obsahuje každý znak, a vrátit správný výsledek pro celý řetězec.
Příklad
Předpokládejme, že máme kolekci nazvanou english
s následujícími dokumenty:
{ "_id" :1, "data" :"Maimuang" }{ "_id" :2, "data" :"M" }{ "_id" :3, "data" :"a" }{ " _id" :4, "data" :"i" }{ "_id" :5, "data" :"m" }{ "_id" :6, "data" :"u" }{ "_id" :7, "data" :"a" }{ "_id" :8, "data" :"n" }{ "_id" :9, "data" :"g" }
Můžeme použít $strLenBytes
do datového pole v těchto dokumentech:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Výsledek:
{ "data" :"Maimuang", "výsledek" :8 }{ "data" :"M", "výsledek" :1 }{ "data" :"a", "výsledek" :1 }{ " data" :"i", "výsledek" :1 }{ "data" :"m", "výsledek" :1 }{ "data" :"u", "výsledek" :1 }{ "data" :"a ", "výsledek" :1 }{ "data" :"n", "výsledek" :1 }{ "data" :"g", "výsledek" :1 }
Vidíme, že celé slovo má 8 bajtů a každý znak má 1 bajt.
Thajské znaky
Zde je příklad, který používá thajské znaky, z nichž každý má 3 bajty.
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" :"ง" }
A co se stane, když použijeme $strLenBytes
k těm dokumentům:
db.thai.aggregate( [ { $project:{ _id:0, data:1, výsledek:{ $strLenBytes:"$data" } } } ])
Výsledek:
{ "data" :"ไม้เมือง", "výsledek" :24 }{ "data" :"ไ", "výsledek" :3 }{ "data" :"ม้", "výsledek" :6 }{ "data" :"เ", "výsledek" :3 }{ "data" :"มื", "výsledek" :6 }{ "data" :"อ", "výsledek" :3 }{ "data" :" §", "výsledek" :3 }
Dva z těchto znaků byly upraveny pomocí diakritiky, což má za následek vrácení 6 bajtů.
Další postavy
Předpokládejme, že máme kolekci nazvanou other
s následujícími dokumenty:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }A použijeme
$strLenBytes
k těm dokumentům:db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
{ "data" :"é", "result" :2 }{ "data" :"©", "result" :2 }{ "data" :"℘", "result" :3 }První dva znaky jsou 2 bajty a třetí 3 bajty. Počet bajtů závisí na charakteru. Některé znaky mohou používat 4 bajty.
Znak mezery používá bajt. Dva znaky mezery proto používají 2 bajty a tak dále.
Předpokládejme, že máme následující dokumenty:
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }A použijeme
$strLenBytes
k těm dokumentům:db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
{ "data" :" ", "výsledek" :1 }{ "data" :" ", "výsledek" :2 }Prázdné řetězce
Prázdné řetězce vrátí
0
.Zde je dokument s prázdným řetězcem:
{ "_id" :6, "data" :"" }A co se stane, když použijeme
$strLenBytes
k tomuto dokumentu:db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
{ "data" :"", "výsledek" :0 }Nesprávný datový typ
Předání nesprávného datového typu vede k chybě.
Předpokládejme, že máme následující dokument:
{ "_id" :7, "data" :123 }
field
dat obsahuje číslo.Aplikujme
$strLenBytes
k tomuto dokumentu:db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
Chyba:příkaz se nezdařil:{ "ok" :0, "errmsg" :"$strLenBytes vyžaduje argument řetězce, nalezeno:double", "code" :34473, "codeName" :"Location34473"} :agregace selhala :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1Nulové hodnoty
Poskytování
null
také vede k chybě.Předpokládejme, že máme následující dokument:
{ "_id" :8, "data" :null }
field
dat obsahujenull
.Aplikujme
$strLenBytes
k tomuto dokumentu:db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
nezachycená výjimka:Chyba:příkaz se nezdařil:{ "ok" :0, "errmsg":"$strLenBytes vyžaduje argument řetězce, nalezeno:null", "code" :34473, "codeName" :"Location34473"} :agregace selhala :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639 :[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1Chybějící pole
Pokračujeme v tématu vytváření chyb a zadání neexistujícího pole také způsobí chybu.
Dokument:
{ "_id" :9 }Použít
$strLenBytes
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Výsledek:
Chyba:příkaz se nezdařil:{ "ok" :0, "errmsg" :"$strLenBytes vyžaduje argument řetězce, nalezeno:chybí", "code" :34473, "codeName" :"Location34473"} :agregace selhala :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example@ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1