MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $indexOfCP

In MongoDB der $indexOfCP Der Aggregations-Pipeline-Operator durchsucht eine Zeichenfolge nach einem Vorkommen einer Teilzeichenfolge und gibt den UTF-Codepunktindex des ersten Vorkommens zurück.

Der UTF-Codepunktindex ist nullbasiert (d. h. er beginnt bei 0 ).

Syntax

Die Syntax lautet wie folgt:

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

Wo:

  • <string expression> ist die Zeichenfolge, nach der gesucht werden soll.
  • <substring expression> ist die Teilzeichenfolge, die Sie in der Zeichenfolge finden möchten.
  • <start> ist ein optionales Argument, das eine Startindexposition für die Suche angibt. Kann ein beliebiger gültiger Ausdruck sein, der sich in eine nicht negative ganze Zahl auflösen lässt.
  • <end> ist ein optionales Argument, das eine Endindexposition für die Suche angibt. Kann ein beliebiger gültiger Ausdruck sein, der sich in eine nicht negative ganze Zahl auflösen lässt.

Wenn der angegebene Wert nicht gefunden wird, $indexOfCP gibt -1 zurück .

Wenn mehrere Instanzen des angegebenen Werts vorhanden sind, wird nur die erste zurückgegeben.

Beispiel

Angenommen, wir haben eine Sammlung namens test mit folgenden Dokumenten:

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

Hier ist ein Beispiel für die Anwendung von $indexOfCP zu diesen Dokumenten:

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

Ergebnis:

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

In den ersten beiden Dokumenten wurde die Teilzeichenfolge an der Indexposition des UTF-Codepunkts 2 gefunden . Gegeben $indexOfCP Ergebnisse sind nullbasiert (der Index beginnt bei 0 ) stellt die Position 2 den dritten Codepunkt dar.

Dies ist ein anderes Ergebnis als bei Verwendung von $indexOfBytes , weil das Copyright-Symbol (© ) im zweiten Dokument nimmt 2 Bytes ein. Aber es verwendet nur einen Codepunkt, der mit dem Buchstaben c identisch ist verwendet.

In Bezug auf das dritte Dokument wurde der Teilstring überhaupt nicht gefunden, daher ist das Ergebnis -1 .

Hier ist ein weiteres Beispiel, außer dass wir dieses Mal nach einem thailändischen Zeichen suchen:

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

Ergebnis:

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

In diesem Fall haben wir nach einem Zeichen im dritten Dokument gesucht, und sein UTF-8-Codepunktindex kommt als 3 zurück . Gegeben $indexOfCP Die Ergebnisse sind nullbasiert, das heißt, es ist der vierte Codepunkt.

Dies liegt daran, dass das zweite Zeichen ein diakritisches Zeichen hat, das auch ein Codepunkt ist. Daher ist das erste Zeichen ein Codepunkt und das zweite Zeichen zwei Codepunkte (einschließlich des diakritischen Zeichens), was drei entspricht. Das bedeutet, dass unser Charakter an der vierten Position beginnt (das ist die Codepunktnummer 3 , da die Indexzählung bei 0 beginnt ).

Siehe MongoDB $strLenCP für ein Beispiel, das die Anzahl der Codepunkte für jedes Zeichen in dieser bestimmten Zeichenfolge zurückgibt. Und siehe MongoDB $strLenBytes um die Anzahl der Bytes in derselben Zeichenfolge zu sehen.

Geben Sie eine Startposition an

Sie können ein drittes Argument angeben, um eine Startindexposition für die Suche anzugeben.

Angenommen, wir haben das folgende Dokument:

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

Hier ist ein Beispiel für die Anwendung von $indexOfCP mit einer Startposition:

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

Ergebnis:

{ "data" : "ABC XYZ ABC", "result" : 8 }

In diesem Fall wurde die zweite Instanz der Teilzeichenfolge zurückgegeben. Das liegt daran, dass wir die Suche an Position 1 gestartet haben , und die erste Instanz der Teilzeichenfolge beginnt an Position 0 (vor der Startposition für die Suche).

Wenn die Startposition eine Zahl größer als die Zeichenfolge oder größer als die Endposition ist, $indexOfCP gibt -1 zurück .

Wenn es sich um eine negative Zahl handelt, $indexOfCP gibt einen Fehler zurück.

Geben Sie eine Endposition an

Sie können auch ein viertes Argument angeben, um die letzte Indexposition für die Suche anzugeben.

Wenn Sie dieses Argument angeben, müssen Sie auch eine Ausgangsposition angeben. Andernfalls wird dieses Argument als Ausgangspunkt interpretiert.

Beispiel:

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

Ergebnis:

{ "data" : "ABC XYZ ABC", "result" : -1 }

Das Ergebnis ist -1 was bedeutet, dass der Teilstring nicht gefunden wurde. Das liegt daran, dass wir unsere Suche an Position 0 gestartet haben und beendete es an Position 3 , daher wird der Teilstring nicht erfasst.

Folgendes passiert, wenn wir die Endindexposition erhöhen:

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

Ergebnis:

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

Dieses Mal wurde der Wert eingeschlossen und seine Indexposition zurückgegeben.

Wenn die Endposition eine Zahl kleiner als die Startposition ist, $indexOfCP gibt -1 zurück .

Wenn es sich um eine negative Zahl handelt, $indexOfCP gibt einen Fehler zurück.

Fehlende Felder

Wenn sich das Feld nicht im Dokument befindet, $indexOfCP gibt null zurück .

Angenommen, wir haben das folgende Dokument:

{ "_id" : 5 }

Folgendes passiert, wenn wir $indexOfCP anwenden :

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

Ergebnis:

{ "result" : null }

Nullwerte

Wenn das erste Argument null ist , $indexOfCP gibt null zurück .

Angenommen, wir haben das folgende Dokument:

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

Folgendes passiert, wenn wir $indexOfCP anwenden :

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

Ergebnis:

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

Wenn jedoch das zweite Argument (d. h. die Teilzeichenfolge) null ist , wird ein Fehler zurückgegeben:

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

Ergebnis:

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

Falscher Datentyp

Wenn das erste Argument den falschen Datentyp hat (d. h. es wird nicht in einen String aufgelöst), $indexOfCP gibt einen Fehler zurück.

Angenommen, wir haben das folgende Dokument:

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

Folgendes passiert, wenn wir $indexOfCP anwenden zu diesem Dokument:

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

Ergebnis:

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

Wie die Fehlermeldung besagt, erfordert $indexOfCP requires a string as the first argument .