I MongoDB er $substrBytes
aggregeringspipeline-operator returnerer understrengen af en streng baseret på de specificerede UTF-8-kodede bytes-indekser.
Syntaks
Syntaksen ser sådan ud:
{ $substrBytes:[ , , ] }
Hvor:
er strengen. Det kan være et hvilket som helst gyldigt udtryk, så længe det opløses til en streng. er hvor du skal starte understrengen. Det kan være et hvilket som helst gyldigt udtryk, så længe det løses til et ikke-negativt heltal eller tal, der kan repræsenteres som et heltal. er hvor mange bytes understrengen skal fortsætte for. Det kan være et hvilket som helst gyldigt udtryk, så længe det løses til et ikke-negativt heltal eller tal, der kan repræsenteres som et heltal.
Eksempel
Forestil dig, at vi har en samling kaldet tests
med følgende dokument:
{ "_id" :1, "data" :"Rød brandbil" }
Vi kan bruge $substrBytes
sådan her:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $substrBytes:[ "$data", 0, 3 ] } } } ])
Resultat:
{ "data" :"Rød brandbil", "result" :"Rød" }
Indekset starter ved nul, så vores understreng startede ved begyndelsen af strengen og fortsatte i tre bytes.
I dette tilfælde bruger vi engelske tegn, og hvert tegn er en byte. Dette gør det nemt for os at tælle, hvor mange bytes vi skal bruge.
Lad os køre et andet eksempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result_1:{ $substrBytes:[ "$data", 4, 4 ] }, result_2:{ $substrBytes:[ "$data", 8, 5 ] }, result_3:{ $substrBytes:[ "$data", 8, 20 ] } } ] ).pretty()
Resultat:
{ "data" :"Rød brandbil", "result_1" :"Brand", "result_2" :"lastbil", "result_3" :"lastbil"}
Bemærk i vores tredje resultat, at vi specificerede flere bytes, end der var tilgængelige, men det returnerede simpelthen alle tegn til slutningen af strengen.
Multi-Byte-tegn
Nogle tegn bruger mere end én byte. Nogle bruger to, nogle bruger tre, og nogle bruger endda fire.
Her er et eksempel på et dokument, der indeholder en masse symboler:
{ "_id" :2, "data" :"©♡★✪☆" }
Hvert af disse tegn bruger mere end én byte. Det betyder, at vi skal være forsigtige, når vi uddrager en understreng. Vi skal være sikre på, at vores udgangspunkt ikke starter halvvejs gennem en karakter. Hvis det gør, vil der opstå en fejl. Ligeledes skal vi sikre, at vores slutpunkt ikke ender halvvejs gennem en karakter.
Lad os indtil videre anvende $substrBytes
uden at bevirke en fejl:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 2 ] } } }, { $project:{ _id:0, data:1, bytes:{ $strLenBytes:[ "$data" ] }, resultat:{ $substrBytes:[ "$data", 0, 5 ] } } } ])
Resultat:
{ "data" :"©♡★✪☆", "bytes" :14, "result" :"©♡" }
Baseret på vores udgangspunkt 0
og vores byte-længde på 5
, får vi to tegn i vores resultatsæt. Derfor kan vi se, at de to første tegn bruger 5 bytes.
I dette eksempel brugte jeg også $strLenBytes
for at returnere det samlede antal bytes i strengen. Jeg gjorde dette hovedsageligt for at vise, at de fem tegn bruger 14 bytes (flere bytes pr. tegn).
Her er et let ændret eksempel, der returnerer hver af de to returnerede tegn:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 2 ] } } }, { $project:{ _id:0, data:1, r1:{ $substrBytes:[ "$data", 0, 2 ] }, r2:{ $substrBytes:[ "$data", 2, 3 ] } } ])
Resultat:
{ "data" :"©♡★✪☆", "r1" :"©", "r2" :"♡" }
Vi kan se, at det første tegn bruger to bytes og det andet tegn bruger tre.
Forkert udgangspunkt
Hvis dit udgangspunkt er halvvejs gennem et tegn, opstår der en fejl.
Eksempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 2 ] } } }, { $project:{ _id:0, data:1, result:{ $substrBytes:[ "$data", 1, 2 ] } } } ])
Resultat:
Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$substrBytes:Ugyldigt område, startindeks er en UTF-8-fortsættelsesbyte.", "code" :28656, "codeName" :"Location28656 "} :aggregat 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@(shell):1:1
Denne fejl fortæller os, at startindekset er en UTF-8-fortsættelsesbyte
. Med andre ord forsøgte vi at starte halvvejs gennem en karakter.
Forkert slutpunkt
Det er det samme med slutpunktet. Hvis dit slutpunkt er halvvejs gennem et tegn, opstår der en fejl.
Eksempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 2 ] } } }, { $project:{ _id:0, data:1, result:{ $substrBytes:[ "$data", 0, 1 ] } } } ])
Resultat:
Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$substrBytes:Ugyldigt område, endeindeks er midt i et UTF-8-tegn.", "code" :28657, "codeName" :"Location28657"} :aggregat 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@(shell):1:1
Denne gang fortæller det os, at slutindekset er midt i et UTF-8-tegn
.