MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $indexOfCP

W MongoDB $indexOfCP Operator potoku agregacji przeszukuje ciąg w poszukiwaniu wystąpienia podciągu i zwraca indeks punktu kodowego UTF pierwszego wystąpienia.

Indeks punktu kodowego UTF jest liczony od zera (tzn. zaczyna się od 0 ).

Składnia

Składnia wygląda tak:

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

Gdzie:

  • jest ciągiem do przeszukania.
  • jest podciągiem, który chcesz znaleźć w ciągu.
  • jest opcjonalnym argumentem, który określa początkową pozycję indeksu wyszukiwania. Może być dowolnym prawidłowym wyrażeniem, które prowadzi do nieujemnej liczby całkowitej.
  • jest opcjonalnym argumentem, który określa końcową pozycję indeksu wyszukiwania. Może być dowolnym prawidłowym wyrażeniem, które prowadzi do nieujemnej liczby całkowitej.

Jeśli podana wartość nie zostanie znaleziona, $indexOfCP zwraca -1 .

Jeśli istnieje wiele wystąpień określonej wartości, zwracana jest tylko pierwsza.

Przykład

Załóżmy, że mamy kolekcję o nazwie test z następującymi dokumentami:

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

Oto przykład zastosowania $indexOfCP do tych dokumentów:

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

Wynik:

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

W pierwszych dwóch dokumentach podciąg został znaleziony w pozycji indeksu punktu kodu UTF 2 . Przyznano $indexOfCP wyniki są liczone od zera (indeks zaczyna się od 0 ) pozycja 2 reprezentuje trzeci punkt kodowy.

Jest to inny wynik niż ten, który otrzymalibyśmy, gdybyśmy użyli $indexOfBytes , ponieważ symbol praw autorskich (© ) w drugim dokumencie zajmuje 2 bajty. Ale używa tylko jednego punktu kodowego, który jest taki sam jak litera c zastosowań.

Jeśli chodzi o trzeci dokument, podciąg w ogóle nie został znaleziony, więc wynik to -1 .

Oto kolejny przykład, ale tym razem szukamy znaku tajskiego:

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

Wynik:

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

W tym przypadku szukaliśmy znaku, który znajduje się w trzecim dokumencie, a jego indeks punktu kodowego UTF-8 jest zwracany jako 3 . Przyznano $indexOfCP wyniki są od zera, co oznacza, że ​​jest to czwarty punkt kodowy.

Dzieje się tak, ponieważ drugi znak ma znak diakrytyczny, który jest również punktem kodowym. Dlatego pierwszy znak to jeden punkt kodowy, a drugi znak to dwa punkty kodowe (w tym znak diakrytyczny), co równa się trzem. Oznacza to, że nasza postać zaczyna się na czwartej pozycji (czyli numer punktu kodowego 3 , ponieważ liczba indeksów zaczyna się od 0 ).

Zobacz MongoDB $strLenCP na przykład, który zwraca liczbę punktów kodowych dla każdego znaku w tym konkretnym ciągu. I zobacz MongoDB $strLenBytes aby zobaczyć liczbę bajtów w tym samym ciągu.

Określ pozycję startową

Możesz podać trzeci argument, aby określić początkową pozycję indeksu wyszukiwania.

Załóżmy, że mamy następujący dokument:

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

Oto przykład zastosowania $indexOfCP z pozycją wyjściową:

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

Wynik:

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

W tym przypadku zostało zwrócone drugie wystąpienie podciągu. Dzieje się tak, ponieważ rozpoczęliśmy wyszukiwanie na pozycji 1 , a pierwsze wystąpienie podciągu zaczyna się od pozycji 0 (przed pozycją początkową wyszukiwania).

Jeśli pozycja początkowa jest liczbą większą niż ciąg lub większą niż pozycja końcowa, $indexOfCP zwraca -1 .

Jeśli jest to liczba ujemna, $indexOfCP zwraca błąd.

Określ pozycję końcową

Możesz również podać czwarty argument, aby określić końcową pozycję indeksu wyszukiwania.

Jeśli podasz ten argument, musisz również podać pozycję początkową. Jeśli tego nie zrobisz, ten argument zostanie zinterpretowany jako punkt wyjścia.

Przykład:

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

Wynik:

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

Wynik to -1 co oznacza, że ​​podciąg nie został znaleziony. To dlatego, że rozpoczęliśmy nasze poszukiwania na pozycji 0 i zakończył na pozycji 3 , dlatego nie przechwytuje podciągu.

Oto, co się stanie, jeśli zwiększymy końcową pozycję indeksu:

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

Wynik:

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

Tym razem wartość została uwzględniona, a jej pozycja indeksu zwrócona.

Jeśli pozycja końcowa jest liczbą mniejszą niż pozycja początkowa, $indexOfCP zwraca -1 .

Jeśli jest to liczba ujemna, $indexOfCP zwraca błąd.

Brakujące pola

Jeśli pola nie ma w dokumencie, $indexOfCP zwraca null .

Załóżmy, że mamy następujący dokument:

{ "_id" : 5 }

Oto, co się dzieje, gdy zastosujemy $indexOfCP :

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

Wynik:

{ "result" : null }

Wartości puste

Jeśli pierwszym argumentem jest null , $indexOfCP zwraca null .

Załóżmy, że mamy następujący dokument:

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

Oto, co się dzieje, gdy zastosujemy $indexOfCP :

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

Wynik:

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

Jednak gdy drugim argumentem (tj. podciągiem) jest null , zwracany jest błąd:

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

Wynik:

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

Niewłaściwy typ danych

Jeśli pierwszy argument jest niewłaściwym typem danych (tzn. nie jest tłumaczony na łańcuch), $indexOfCP zwraca błąd.

Załóżmy, że mamy następujący dokument:

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

Oto, co się dzieje, gdy zastosujemy $indexOfCP do tego dokumentu:

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

Wynik:

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

Jak stwierdza komunikat o błędzie, $indexOfCP wymaga ciągu jako pierwszego argumentu .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak policzyć liczbę dokumentów w kolekcji mongodb

  2. Automatyzacja sprawdzania konfiguracji bazy danych

  3. Jak uruchamiać nieprzetworzone zapytania MongoDB bezpośrednio w Ruby?

  4. Jak MongoDB umożliwia uczenie maszynowe

  5. jak pobrać plik zapisany w gridFS za pomocą nodeJS