I MongoDB er $indexOfCP
aggregeringspipeline-operatør søger i en streng efter en forekomst af en understreng og returnerer UTF-kodepunktindekset for den første forekomst.
UTF-kodepunktindekset er nul-baseret (dvs. det starter ved 0
).
Syntaks
Syntaksen ser sådan ud:
{ $indexOfCP:[ , , , ] }
Hvor:
er strengen, der skal søges i. er den understreng, du vil finde i strengen. er et valgfrit argument, der angiver en startindeksposition for søgningen. Kan være et hvilket som helst gyldigt udtryk, der opløses til et ikke-negativt heltal. er et valgfrit argument, der angiver en afsluttende indeksposition for søgningen. Kan være et hvilket som helst gyldigt udtryk, der opløses til et ikke-negativt heltal.
Hvis den angivne værdi ikke findes, $indexOfCP
returnerer -1
.
Hvis der er flere forekomster af den angivne værdi, returneres kun den første.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokumenter:
{ "_id" :1, "data" :"c 2021" }{ "_id" :2, "data" :"© 2021" }{ "_id" :3, "data" :"ไม้เมือง" }
Her er et eksempel på anvendelse af $indexOfCP
til disse dokumenter:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "2021" ] } } } ])
Resultat:
{ "data" :"c 2021", "result" :2 }{ "data" :"© 2021", "result" :2 }{ "data" :"ไม้เมือง", "result" :- 1 }
I de første to dokumenter blev understrengen fundet ved UTF-kodepunktindeksposition 2
. Givet $indexOfCP
resultater er nul-baserede (indekset starter ved 0
) positionen 2 repræsenterer det tredje kodepunkt.
Dette er et andet resultat end det, vi ville få, hvis vi bruger $indexOfBytes
, fordi copyright-symbolet (©
) i det andet dokument fylder 2 bytes. Men den bruger kun ét kodepunkt, hvilket er det samme som bogstavet c
bruger.
Med hensyn til det tredje dokument, blev understrengen slet ikke fundet, og derfor er resultatet -1
.
Her er et andet eksempel, bortset fra at denne gang søger vi efter et thailandsk tegn:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1, 2, 3 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "เ" ] } } } ])
Resultat:
{ "data" :"c 2021", "result" :-1 }{ "data" :"© 2021", "result" :-1 }{ "data" :"ไม้เมือง", "result" :3 }
I dette tilfælde søgte vi efter et tegn, der er i det tredje dokument, og dets UTF-8 kodepunktindeks kommer tilbage som 3
. Givet $indexOfCP
resultater er nul-baserede, det betyder, at det er det fjerde kodepunkt.
Dette skyldes, at det andet tegn har et diakritisk tegn, som også er et kodepunkt. Derfor er det første tegn et kodepunkt, og det andet tegn er to kodepunkter (inklusive diakriten), hvilket er lig med tre. Det betyder, at vores karakter starter på den fjerde position (som er kodepunkt nummer 3
, på grund af indeksantal, der starter ved 0
).
Se MongoDB $strLenCP
for et eksempel, der returnerer antallet af kodepunkter for hvert tegn i denne særlige streng. Og se MongoDB $strLenBytes
for at se antallet af bytes i den samme streng.
Angiv en startposition
Du kan angive et tredje argument for at angive en startindeksposition for søgningen.
Antag, at vi har følgende dokument:
{ "_id" :4, "data" :"ABC XYZ ABC" }
Her er et eksempel på anvendelse af $indexOfCP
med en startposition:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "ABC", 1 ] } } } ])
Resultat:
{ "data" :"ABC XYZ ABC", "result" :8 }
I dette tilfælde blev den anden forekomst af understrengen returneret. Dette skyldes, at vi startede søgningen ved position 1
, og den første instans af understrengen starter ved position 0
(før startpositionen for søgningen).
Hvis startpositionen er et tal større end strengen eller større end slutpositionen, $indexOfCP
returnerer -1
.
Hvis det er et negativt tal, $indexOfCP
returnerer en fejl.
Angiv en slutposition
Du kan også angive et fjerde argument for at angive den afsluttende indeksposition for søgningen.
Hvis du giver dette argument, skal du også angive en startposition. Hvis dette ikke gøres, vil dette argument blive fortolket som udgangspunktet.
Eksempel:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "XYZ", 0, 3 ] } } } ])
Resultat:
{ "data" :"ABC XYZ ABC", "result" :-1 }
Resultatet er -1
hvilket betyder, at understrengen ikke blev fundet. Det er fordi vi startede vores søgning på position 0
og afsluttede det på position 3
, derfor fanger understrengen ikke.
Her er, hvad der sker, hvis vi øger den afsluttende indeksposition:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 4 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "XYZ", 0, 5 ] } } } ])
Resultat:
{ "data" :"ABC XYZ ABC", "result" :4 }
Denne gang blev værdien inkluderet, og dens indeksposition returneret.
Hvis slutpositionen er et tal mindre end startpositionen, $indexOfCP
returnerer -1
.
Hvis det er et negativt tal, $indexOfCP
returnerer en fejl.
Manglende felter
Hvis feltet ikke er i dokumentet, $indexOfCP
returnerer null
.
Antag, at vi har følgende dokument:
{ "_id" :5 }
Her er, hvad der sker, når vi anvender $indexOfCP
:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 5 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "XYZ" ] } } } ])
Resultat:
{ "result" :null }
Nul-værdier
Hvis det første argument er null
, $indexOfCP
returnerer null
.
Antag, at vi har følgende dokument:
{ "_id" :6, "data" :null }
Her er, hvad der sker, når vi anvender $indexOfCP
:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 6 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "XYZ" ] } } } ])
Resultat:
{ "data" :null, "result" :null }
Men når det andet argument (dvs. understrengen) er null
, returneres en fejl:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 1 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", null ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$indexOfCP kræver en streng som det andet argument, fundet:null", "code" :40094, "codeName" :"Location40094 "} :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
Forkert datatype
Hvis det første argument er den forkerte datatype (dvs. det løses ikke til en streng), $indexOfCP
returnerer en fejl.
Antag, at vi har følgende dokument:
{ "_id" :7, "data" :123 }
Her er, hvad der sker, når vi anvender $indexOfCP
til det dokument:
db.test.aggregate( [ { $match:{ _id:{ $in:[ 7 ] } } }, { $project:{ _id:0, data:1, result:{ $indexOfCP:[ "$data", "XYZ" ] } } } ])
Resultat:
ufanget undtagelse:Fejl:kommando mislykkedes:{ "ok" :0, "errmsg" :"$indexOfCP kræver en streng som det første argument, fundet:double", "code" :40093, "codeName" :"Location40093 "} :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
Som fejlmeddelelsen siger, kræver $indexOfCP en streng som det første argument
.