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
.