sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $indexOfCP

I MongoDB, $indexOfCP aggregeringspipeline-operatören söker i en sträng efter en förekomst av en delsträng och returnerar UTF-kodpunktsindexet för den första förekomsten.

UTF-kodpunktsindexet är nollbaserat (dvs. det börjar vid 0 ).

Syntax

Syntaxen ser ut så här:

{ $indexOfCP: [ <string expression>, <substring expression>, <start>, <end> ] }

Var:

  • är strängen att söka.
  • är den delsträng du vill hitta i strängen.
  • är ett valfritt argument som anger en startindexposition för sökningen. Kan vara vilket giltigt uttryck som helst som löser sig till ett icke-negativt heltal.
  • är ett valfritt argument som anger en slutindexposition för sökningen. Kan vara vilket giltigt uttryck som helst som löser sig till ett icke-negativt heltal.

Om det angivna värdet inte hittas, $indexOfCP returnerar -1 .

Om det finns flera instanser av det angivna värdet, returneras bara den första.

Exempel

Anta att vi har en samling som heter test med följande dokument:

{ "_id" : 1, "data" : "c 2021" }
{ "_id" : 2, "data" : "© 2021" }
{ "_id" : 3, "data" : "ไม้เมือง" }

Här är ett exempel på hur du använder $indexOfCP till dessa dokument:

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 två första dokumenten hittades understrängen vid UTF-kodpunktsindexposition 2 . Givet $indexOfCP resultaten är nollbaserade (indexet börjar på 0 ) position 2 representerar den tredje kodpunkten.

Detta är ett annat resultat än vad vi skulle få om vi använder $indexOfBytes , eftersom copyright-symbolen (© ) i det andra dokumentet tar upp 2 byte. Men den använder bara en kodpunkt, vilket är samma som bokstaven c använder.

När det gäller det tredje dokumentet hittades inte delsträngen alls, så resultatet är -1 .

Här är ett annat exempel, förutom den här gången söker vi efter ett thailändskt tecken:

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 det här fallet sökte vi efter ett tecken som finns i det tredje dokumentet, och dess UTF-8 kodpunktsindex kommer tillbaka som 3 . Givet $indexOfCP resultaten är nollbaserade, detta betyder att det är den fjärde kodpunkten.

Detta beror på att det andra tecknet har ett diakritiskt tecken, vilket också är en kodpunkt. Därför är det första tecknet en kodpunkt och det andra tecknet är två kodpunkter (inklusive diakritiken), vilket är lika med tre. Det betyder att vårt tecken börjar på fjärde positionen (som är kodpunktsnummer 3). , på grund av indexantal som börjar på 0 ).

Se MongoDB $strLenCP för ett exempel som returnerar antalet kodpunkter för varje tecken i just den här strängen. Och se MongoDB $strLenBytes för att se antalet byte i samma sträng.

Ange en startposition

Du kan ange ett tredje argument för att ange en startindexposition för sökningen.

Anta att vi har följande dokument:

{ "_id" : 4, "data" : "ABC XYZ ABC" }

Här är ett exempel på hur du använder $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 det här fallet returnerades den andra instansen av delsträngen. Detta beror på att vi startade sökningen vid position 1 , och den första instansen av delsträngen börjar vid position 0 (före startpositionen för sökningen).

Om startpositionen är ett nummer större än strängen eller större än slutpositionen, $indexOfCP returnerar -1 .

Om det är ett negativt tal, $indexOfCP returnerar ett fel.

Ange en slutposition

Du kan också ange ett fjärde argument för att ange slutindexpositionen för sökningen.

Om du ger detta argument måste du också ange en utgångsposition. Underlåtenhet att göra det kommer att resultera i att detta argument tolkas som utgångspunkten.

Exempel:

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 är -1 vilket betyder att delsträngen inte hittades. Det beror på att vi började vår sökning på position 0 och avslutade den på position 3 , därför inte fånga understrängen.

Så här händer om vi ökar slutindexpositionen:

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 }

Den här gången inkluderades värdet och dess indexposition returnerades.

Om slutpositionen är ett nummer mindre än startpositionen, $indexOfCP returnerar -1 .

Om det är ett negativt tal, $indexOfCP returnerar ett fel.

Fält saknas

Om fältet inte finns i dokumentet, $indexOfCP returnerar null .

Anta att vi har följande dokument:

{ "_id" : 5 }

Det här är vad som händer när vi använder $indexOfCP :

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

Resultat:

{ "result" : null }

Nullvärden

Om det första argumentet är null , $indexOfCP returnerar null .

Anta att vi har följande dokument:

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

Det här är vad som händer när vi använder $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 andra argumentet (dvs understrängen) är null , returneras ett fel:

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

Resultat:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the second argument, found: null",
	"code" : 40094,
	"codeName" : "Location40094"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Fel datatyp

Om det första argumentet är fel datatyp (dvs. det löser sig inte till en sträng), $indexOfCP returnerar ett fel.

Anta att vi har följande dokument:

{ "_id" : 7, "data" : 123 }

Det här är vad som händer när vi använder $indexOfCP till det dokumentet:

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

Resultat:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfCP requires a string as the first argument, found: double",
	"code" : 40093,
	"codeName" : "Location40093"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Som felmeddelandet säger kräver $indexOfCP en sträng som första argument .


  1. mongodb:fråga för tidsperioden mellan två datumfält

  2. Redis, Node.js och Socket.io:Korsserverautentisering och förståelse för node.js

  3. Hitta objekt mellan två datum MongoDB

  4. Kan MongoDB aggregeringsramverket $group returnera en rad värden?