sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $substrBytes

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 .


  1. Føj data til eksisterende gridfs-fil

  2. Omdøb et felt i en MongoDB-samling

  3. MongoDB:hvordan finder man 10 tilfældige dokumenter i en samling på 100?

  4. MongoDB $lt Aggregation Pipeline Operator