MongoDB, $strLenBytes
aggregeringspipeline-operatør returnerer antallet af UTF-8-kodede bytes i den angivne streng.
Hvert tegn i en streng kan indeholde et forskelligt antal bytes, afhængigt af det anvendte tegn. $strLenBytes
operatør kan finde ud af, hvor mange bytes hvert tegn indeholder og returnere det korrekte resultat for hele strengen.
Eksempel
Antag, at vi har en samling kaldet english
med følgende dokumenter:
{ "_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" }
Vi kan anvende $strLenBytes
til datafeltet i disse dokumenter:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Resultat:
{ "data" :"Maimuang", "result" :8 }{ "data" :"M", "result" :1 }{ "data" :"a", "result" :1 }{ " data" :"i", "result" :1 }{ "data" :"m", "result" :1 }{ "data" :"u", "result" :1 }{ "data" :"a ", "result" :1 }{ "data" :"n", "result" :1 }{ "data" :"g", "result" :1 }
Vi kan se, at hele ordet er 8 bytes, og hvert tegn er 1 byte hver.
Thaiske tegn
Her er et eksempel, der bruger thailandske tegn, som hver er på 3 bytes.
Vi har en samling kaldet thai
med følgende dokumenter:
{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "data" :"ง" }
Og her er, hvad der sker, når vi anvender $strLenBytes
til disse dokumenter:
db.thai.aggregate( [ { $project:{ _id:0, data:1, result:{ $strLenBytes:"$data" } } ])
Resultat:
{ "data" :"ไม้เมือง", "result" :24 }{ "data" :"ไ", "result" :3 }{ "data" :"ม้", "result" :6 }{ "data" :"เ", "result" :3 }{ "data" :"มื", "result" :6 }{ "data" :"อ", "result" :3 }{ "data" :" ง", "resultat" :3 }
To af disse tegn er blevet ændret ved hjælp af diakritiske tegn, hvilket resulterer i, at 6 bytes returneres.
Andre tegn
Antag, at vi har en samling kaldet other
med følgende dokumenter:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Og lad os anvende
$strLenBytes
til disse dokumenter:db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :"é", "result" :2 }{ "data" :"©", "result" :2 }{ "data" :"℘", "result" :3 }De første to tegn er 2 bytes og det tredje er 3 bytes. Antallet af bytes afhænger af tegnet. Nogle tegn kan bruge 4 bytes.
Mellemrumstegnet bruger en byte. To mellemrumstegn bruger derfor 2 bytes, og så videre.
Antag, at vi har følgende dokumenter:
{ "_id" :4, "data" :" " }{ "_id" :5, "data" :" " }Og vi anvender
$strLenBytes
til disse dokumenter:db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :" ", "result" :1 }{ "data" :" ", "result" :2 }Tomme strenge
Tomme strenge returnerer
0
.Her er et dokument med en tom streng:
{ "_id" :6, "data" :"" }Og her er, hvad der sker, når vi anvender
$strLenBytes
til det dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
{ "data" :"", "result" :0 }Forkert datatype
Sender den forkerte datatype, resulterer det i en fejl.
Antag, at vi har følgende dokument:
{ "_id" :7, "data" :123 }Data
field
indeholder et tal.Lad os anvende
$strLenBytes
til det dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$strLenBytes kræver et strengargument, fundet:double", "code" :34473, "codeName" :"Location34473"} :aggregering mislykkedes :[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:1Nul-værdier
Giver
null
resulterer også i en fejl.Antag, at vi har følgende dokument:
{ "_id" :8, "data" :null }Data
field
indeholdernull
.Lad os anvende
$strLenBytes
til det dokument:db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$strLenBytes kræver et string-argument, fundet:null", "code" :34473, "codeName" :"Location34473"} :sammenlægning mislykkedes :[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 @(skal):1:1Manglende felter
Hvis du fortsætter med temaet om at producere fejl, giver det også en fejl at angive et ikke-eksisterende felt.
Dokument:
{ "_id" :9 }Anvend
$strLenBytes
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Resultat:
Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$strLenBytes kræver et string-argument, fundet:mangler", "code" :34473, "codeName" :"Location34473"} :aggregering mislykkedes :[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