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

MongoDB $indexOfCP

In MongoDB, il $indexOfCP l'operatore della pipeline di aggregazione cerca in una stringa un'occorrenza di una sottostringa e restituisce l'indice del punto di codice UTF della prima occorrenza.

L'indice del punto di codice UTF è a base zero (cioè inizia da 0 ).

Sintassi

La sintassi è questa:

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

Dove:

  • <string expression> è la stringa da cercare.
  • <substring expression> è la sottostringa che vuoi trovare nella stringa.
  • <start> è un argomento facoltativo che specifica una posizione di indice iniziale per la ricerca. Può essere qualsiasi espressione valida che si risolve in un numero intero non negativo.
  • <end> è un argomento facoltativo che specifica una posizione di indice finale per la ricerca. Può essere qualsiasi espressione valida che si risolve in un numero intero non negativo.

Se il valore specificato non viene trovato, $indexOfCP restituisce -1 .

Se sono presenti più istanze del valore specificato, viene restituita solo la prima.

Esempio

Supponiamo di avere una collezione chiamata test con i seguenti documenti:

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

Ecco un esempio di applicazione di $indexOfCP a quei documenti:

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

Risultato:

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

Nei primi due documenti, la sottostringa è stata trovata nella posizione dell'indice del punto di codice UTF 2 . Dato $indexOfCP i risultati sono in base zero (l'indice inizia da 0 ) la posizione 2 rappresenta il terzo punto di codice.

Questo è un risultato diverso da quello che otterremmo se usiamo $indexOfBytes , perché il simbolo del copyright (© ) nel secondo documento occupa 2 byte. Ma usa solo un punto di codice, che è lo stesso della lettera c utilizza.

Per quanto riguarda il terzo documento, la sottostringa non è stata trovata affatto, quindi il risultato è -1 .

Ecco un altro esempio, tranne che questa volta cerchiamo un carattere tailandese:

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

Risultato:

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

In questo caso, abbiamo cercato un carattere che si trova nel terzo documento e il suo indice del punto di codice UTF-8 ritorna come 3 . Dato $indexOfCP i risultati sono a base zero, questo significa che è il quarto punto di codice.

Questo perché il secondo carattere ha un segno diacritico, che è anche un punto di codice. Pertanto, il primo carattere è un punto di codice e il secondo carattere è due punti di codice (incluso il segno diacritico), che equivale a tre. Ciò significa che il nostro personaggio inizia dalla quarta posizione (che è il numero del punto di codice 3 , a causa del conteggio dell'indice a partire da 0 ).

Vedi MongoDB $strLenCP per un esempio che restituisce il numero di punti di codice per ogni carattere in questa particolare stringa. E vedi MongoDB $strLenBytes per vedere il numero di byte nella stessa stringa.

Specifica una posizione di partenza

Puoi fornire un terzo argomento per specificare una posizione di indice iniziale per la ricerca.

Supponiamo di avere il seguente documento:

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

Ecco un esempio di applicazione di $indexOfCP con una posizione di partenza:

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

Risultato:

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

In questo caso, è stata restituita la seconda istanza della sottostringa. Questo perché abbiamo iniziato la ricerca nella posizione 1 e la prima istanza della sottostringa inizia nella posizione 0 (prima della posizione di partenza per la ricerca).

Se la posizione iniziale è un numero maggiore della stringa o maggiore della posizione finale, $indexOfCP restituisce -1 .

Se è un numero negativo, $indexOfCP restituisce un errore.

Specifica una posizione finale

Puoi anche fornire un quarto argomento per specificare la posizione dell'indice finale per la ricerca.

Se fornisci questo argomento, devi anche fornire una posizione di partenza. In caso contrario, questo argomento verrà interpretato come punto di partenza.

Esempio:

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

Risultato:

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

Il risultato è -1 il che significa che la sottostringa non è stata trovata. Questo perché abbiamo iniziato la nostra ricerca nella posizione 0 e l'ha terminato alla posizione 3 , quindi non catturando la sottostringa.

Ecco cosa succede se incrementiamo la posizione dell'indice finale:

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

Risultato:

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

Questa volta il valore è stato incluso e la sua posizione di indice è stata restituita.

Se la posizione finale è un numero inferiore alla posizione iniziale, $indexOfCP restituisce -1 .

Se è un numero negativo, $indexOfCP restituisce un errore.

Campi mancanti

Se il campo non è nel documento, $indexOfCP restituisce null .

Supponiamo di avere il seguente documento:

{ "_id" : 5 }

Ecco cosa succede quando applichiamo $indexOfCP :

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

Risultato:

{ "result" : null }

Valori Nulli

Se il primo argomento è null , $indexOfCP restituisce null .

Supponiamo di avere il seguente documento:

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

Ecco cosa succede quando applichiamo $indexOfCP :

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

Risultato:

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

Tuttavia, quando il secondo argomento (cioè la sottostringa) è null , viene restituito un errore:

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

Risultato:

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

Tipo di dati errato

Se il primo argomento è il tipo di dati sbagliato (cioè non si risolve in una stringa), $indexOfCP restituisce un errore.

Supponiamo di avere il seguente documento:

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

Ecco cosa succede quando applichiamo $indexOfCP a quel documento:

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

Risultato:

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

Come afferma il messaggio di errore, $indexOfCP requires a string as the first argument .