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

MongoDB $indexOfArray

V MongoDB, $indexOfArray Operátor agregačního kanálu hledá v poli výskyt zadané hodnoty a vrací index pole prvního výskytu.

Syntaxe

Syntaxe vypadá takto:

{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }

Kde:

  • <array expression> je pole pro vyhledávání.
  • <search expression> je hodnota, kterou chcete v poli najít.
  • <start> je volitelný argument, který určuje počáteční bod, který se má v poli hledat. 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.

V MongoDB jsou pole založená na nule, takže počet indexů začíná na nule (0 ).

Pokud zadaná hodnota není nalezena, $indexOfArray 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 products s následujícími dokumenty:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "XS", "M", "L" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "XS", "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XXS", "XS", "M", "XL" ] }
{ "_id" : 4, "prod" : "Zap", "sizes" : [ 10, 12, 15 ] }
{ "_id" : 5, "prod" : "Tap", "sizes" : [ 15, 16, 20 ] }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

V prvních dvou dokumentech byla hledaná hodnota nalezena na pozici 0 (pole jsou založeny na nule).

Ve třetím dokumentu byl nalezen na pozici 1 . Všimněte si, že se hledala přesná shoda. Nevrátil pozici 0 , i když je hodnota na pozici 0 obsahuje hledanou hodnotu (tj. XXS obsahuje XS ).

Hodnota hledání nebyla v posledních dvou dokumentech nalezena, a proto -1 byl vrácen.

Zde je další příklad, ale tentokrát hledáme číselnou hodnotu:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15 ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : 0 }

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říklad:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15, 1 ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

V tomto případě hledaný výraz nebyl nalezen ve druhém dokumentu (dokument 5). Důvodem je, že jsme zahájili vyhledávání na pozici 1 a ačkoli tento dokument obsahuje hledaný výraz, je na pozici 0 (před výchozí pozicí pro vyhledávání).

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.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 1 ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }

Třetí dokument vrátil -1 což znamená, že hledaný výraz nebyl nalezen.

Zde je to, co se stane, když zvýšíme koncovou pozici indexu o 1:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 2 ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }

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

Prázdná pole

Hledání prázdného pole vrátí -1 .

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ ], "result" : -1 }

Chybějící pole

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

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

{ "_id" : 8, "prod" : "Map" }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Výsledek:

{ "result" : null }

Nulové hodnoty

Pokud je výraz pole null (místo pole), $indexOfArray vrátí null .

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

{ "_id" : 7, "prod" : "Lap", "sizes" : null }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : null, "result" : null }

Pokud je však hledaný výraz null , výsledkem je -1 , pokud není výraz pole také null nebo jeho pole chybí:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5, 6, 7, 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", null ] }
          }
     }
   ]
)

Výsledek:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }
{ "sizes" : [ ], "result" : -1 }
{ "sizes" : null, "result" : null }
{ "result" : null }

Nesprávný datový typ

Pokud je výraz pole nesprávný datový typ, $indexOfArray vrátí chybu.

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

{ "_id" : 9, "prod" : "Box", "sizes" : "XXL" }

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

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XXL" ] }
          }
     }
   ]
)

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfArray requires an array as a first argument, found: string",
	"code" : 40090,
	"codeName" : "Location40090"
} : 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, $indexOfArray requires an array as a first argument .


  1. Režimy importu mongoimportu

  2. Jak prettify exportované MongoDB dokumenty v mongoexportu

  3. Připojení ke clusteru Redis se nezdařilo

  4. Použití UUID místo ObjectID v MongoDB