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" :"" }