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

MongoDB $indexOfCP

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 .


  1. Føj data til eksisterende gridfs-fil

  2. Introduktion af Apache HBase Medium Object Storage (MOB) komprimeringspartitionspolitikker

  3. MongoDB $currentDate

  4. Hvordan får man opdateret dokument tilbage fra findOneAndUpdate-metoden?