sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $indexOfCP

V MongoDB, $indexOfCP Operátor agregačního kanálu hledá v řetězci výskyt podřetězce a vrací index bodu kódu UTF prvního výskytu.

Index bodu kódu UTF je založen na nule (tj. začíná na 0 ).

Syntaxe

Syntaxe vypadá takto:

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

Kde:

  • <string expression> je řetězec, který se má hledat.
  • <substring expression> je podřetězec, který chcete v řetězci najít.
  • <start> je volitelný argument, který určuje počáteční pozici indexu pro vyhledávání. Může to být jakýkoli platný výraz, který se převádí na nezáporné celé číslo.
  • <end> je volitelný argument, který určuje koncovou pozici indexu pro vyhledávání. Může to být jakýkoli platný výraz, který se převádí na nezáporné celé číslo.

Pokud zadaná hodnota není nalezena, $indexOfCP vrátí -1 .

Pokud existuje více instancí zadané hodnoty, vrátí se pouze první.

Příklad

Předpokládejme, že máme kolekci nazvanou test s následujícími dokumenty:

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

Zde je příklad použití $indexOfCP k těm dokumentům:

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

Výsledek:

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

V prvních dvou dokumentech byl podřetězec nalezen na pozici indexu bodu kódu UTF 2 . Je dáno $indexOfCP výsledky jsou založeny na nule (index začíná na 0 ) pozice 2 představuje třetí kódový bod.

Toto je jiný výsledek, než jaký bychom získali, kdybychom použili $indexOfBytes , protože symbol autorských práv (© ) ve druhém dokumentu zabírá 2 bajty. Ale používá pouze jeden kódový bod, který je stejný jako písmeno c použití.

Pokud jde o třetí dokument, podřetězec nebyl vůbec nalezen, takže výsledek je -1 .

Zde je další příklad, ale tentokrát hledáme thajský znak:

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

Výsledek:

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

V tomto případě jsme hledali znak, který je ve třetím dokumentu, a jeho index bodu kódu UTF-8 se vrátí jako 3 . Je dáno $indexOfCP výsledky jsou založeny na nule, to znamená, že jde o čtvrtý kódový bod.

Je to proto, že druhý znak má diakritické znaménko, které je také kódovým bodem. První znak je tedy jeden kódový bod a druhý znak jsou dva kódové body (včetně diakritiky), což se rovná třem. To znamená, že naše postava začíná na čtvrté pozici (což je číslo bodu kódu 3 , kvůli počtu indexů začínajícím na 0 ).

Viz MongoDB $strLenCP pro příklad, který vrací počet bodů kódu pro každý znak v tomto konkrétním řetězci. A podívejte se na MongoDB $strLenBytes abyste viděli počet bajtů ve stejném řetězci.

Určete počáteční pozici

Můžete zadat třetí argument pro určení počáteční pozice indexu pro vyhledávání.

Předpokládejme, že máme následující dokument:

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

Zde je příklad použití $indexOfCP s výchozí pozicí:

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

Výsledek:

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

V tomto případě byla vrácena druhá instance podřetězce. Důvodem je, že jsme zahájili vyhledávání na pozici 1 a první výskyt podřetězce začíná na pozici 0 (před výchozí pozicí pro vyhledávání).

Pokud je počáteční pozice číslo větší než řetězec nebo větší než koncová pozice, $indexOfCP vrátí -1 .

Pokud je to záporné číslo, $indexOfCP vrátí chybu.

Určete koncovou pozici

Můžete také zadat čtvrtý argument pro určení koncové pozice indexu pro vyhledávání.

Pokud uvedete tento argument, musíte také uvést výchozí pozici. Pokud tak neučiníte, bude tento argument interpretován jako výchozí bod.

Příklad:

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

Výsledek:

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

Výsledek je -1 což znamená, že podřetězec nebyl nalezen. Je to proto, že jsme zahájili vyhledávání na pozici 0 a skončil na pozici 3 , tudíž nezachycuje podřetězec.

Pokud zvýšíme koncovou pozici indexu, stane se toto:

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

Výsledek:

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

Tentokrát byla hodnota zahrnuta a její indexová pozice byla vrácena.

Pokud je koncová pozice o číslo menší než počáteční pozice, $indexOfCP vrátí -1 .

Pokud je to záporné číslo, $indexOfCP vrátí chybu.

Chybějící pole

Pokud pole není v dokumentu, $indexOfCP vrátí null .

Předpokládejme, že máme následující dokument:

{ "_id" : 5 }

Zde je to, co se stane, když použijeme $indexOfCP :

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

Výsledek:

{ "result" : null }

Nulové hodnoty

Pokud je první argument null , $indexOfCP vrátí null .

Předpokládejme, že máme následující dokument:

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

Zde je to, co se stane, když použijeme $indexOfCP :

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

Výsledek:

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

Pokud je však druhý argument (tj. podřetězec) null , je vrácena chyba:

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

Výsledek:

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

Nesprávný datový typ

Pokud je první argument nesprávný datový typ (tj. nelze jej přeložit na řetězec), $indexOfCP vrátí chybu.

Předpokládejme, že máme následující dokument:

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

Zde je to, co se stane, když použijeme $indexOfCP k tomuto dokumentu:

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

Výsledek:

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 uvádí chybová zpráva, $indexOfCP requires a string as the first argument .


  1. Skupina ovladačů MongoDB .NET podle časového rozsahu

  2. Proč záleží na směru indexu v MongoDB?

  3. Zálohy AOF a RDB v redis

  4. Filtrování vložených dokumentů v MongoDB