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

MongoDB $substrCP

I MongoDB er $substrCP aggregeringspipeline-operatør returnerer understrengen af ​​en streng baseret på de angivne UTF-8-kodepunktindekser.

Syntaks

Syntaksen ser sådan ud:

{ $substrCP:[ , , ] }

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 opløses til et ikke-negativt heltal.
  • er hvor mange kodepunkter 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 $substrCP sådan her:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$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 kodepunkter.

I dette tilfælde bruger vi engelske tegn, og hvert tegn har et kodepunkt. Dette gør det nemt for os at tælle, hvor mange kodepunkter der skal bruges.

Lad os køre et andet eksempel:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result_1:{ $substrCP:[ "$data", 4, 4 ] }, result_2:{ $substrCP:[ "$data", 8, 5 ] }, result_3:{ $substrCP:[ "$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 kodepunkter, end der var tilgængelige, men det returnerede simpelthen alle tegn til slutningen af ​​strengen.

Diakritiske tegn

Nogle tegn har tilføjet et diakritisk tegn, hvilket resulterer i flere kodepunkter.

Antag, at vi har en samling kaldet thai som indeholder følgende dokumenter:

{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "data" :"ง" }

Disse dokumenter indeholder thailandske tegn. Vi kan se, at to af disse tegn inkluderer en diakritisk (en lille glyf over den indledende glyf).

Dokumenter 2 til 7 viser blot hvert af de tegn, der er i dokument 1.

Før vi tager en understreng, lad os finde ud af, hvor mange kodepunkter hvert af disse tegn har ved at bruge $strLenCP operatør:

db.thai.aggregate( [ { $project:{ _id:0, data:1, result:{ $strLenCP:"$data" } } ]) 

Resultat:

{ "data" :"ไม้เมือง", "result" :8 }{ "data" :"ไ", "result" :1 }{ "data" :"ม้", "result" :2 }{ "data" :"เ", "result" :1 }{ "data" :"มื", "result" :2 }{ "data" :"อ", "result" :1 }{ "data" :" ง", "result" :1 }

Vi kan se, at de to tegn med diakritiske tegn har to kodepunkter, og de andre har et kodepunkt.

Lad os anvende $substrCP til det første dokument:

db.thai.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 1, 2 ] } } } ]) 

Resultat:

{ "data" :"ไม้เมือง", "result" :"ม้" }

Baseret på vores udgangspunkt 1 og vores kodepunktantal på 2 , får vi det andet tegn og dets tilhørende diakritiske tegn.

Adskil glyfferne

I det foregående eksempel var vores tredje argument 2, så det returnerede tegn og diakrit sammen. Her er, hvad der sker, når vi giver et tredje argument på 1.

db.thai.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 1, 1 ] } } } ]) 

Resultat:

{ "data" :"ไม้เมือง", "result" :"ม" }

Det første tegn returneres uden det diakritiske tegn.

Andre datatyper

$substrCP operatør virker kun på strenge. Men hvis du har en anden datatype, bør den stadig fungere, så længe den kan løses til en streng.

Antag, at vi har følgende dokument:

{ "_id" :2, "data" :123456 }

data feltet indeholder et tal.

Her er, hvad der sker, når vi anvender $substrCP til det felt:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 2 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 1, 2 ] } } } ]) 

Resultat:

{ "data" :123456, "result" :"23" }

Det formåede at klare opgaven fint (selvom du skal huske på, at resultatet er en streng – ikke et tal).

Vi har et andet dokument med et Dato-objekt:

{ "_id" :3, "data" :ISODate("2021-01-03T23:30:15.100Z") }

Lad os nu anvende $substrCP til det dokument:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 3 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 0, 4 ] } } } ]) 

Resultat:

{ "data" :ISODate("2021-01-03T23:30:15.100Z"), "result" :"2021" }

Så det fungerede også fint i dette scenarie.

Nul-værdier

Hvis strengen er null , resultatet er en tom streng.

Antag, at vi har følgende dokument:

{ "_id" :4, "data" :null }

Her er, hvad der sker, når vi anvender $substrCP til det dokument:

db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 1, 2 ] } } } ]) 

Resultat:

{ "data" :null, "result" :"" }

Manglende felt

Forsøg på at hente en understreng fra et felt, der ikke eksisterer, resulterer i en tom streng.

Antag, at vi har følgende dokument:

{ "_id" :5 } 

Anvend $substrCP :

db.test.aggregate( [ { $match:{ _id:{ $in:[ 5 ] } } }, { $project:{ _id:0, data:1, result:{ $substrCP:[ "$data", 1, 2 ] } } } ]) 

Resultat:

{ "result" :"" }


  1. Bestilling af et resultatsæt tilfældigt på mongo

  2. Dårlig opslagssammenlægningsydelse

  3. Hvornår skal jeg bruge en NoSQL-database i stedet for en relationsdatabase? Er det okay at bruge begge på samme side?

  4. Håndtering af MySQL, MongoDB og PostgreSQL med ChatOps fra Slack