V MongoDB, $in
Operátor dotazu vybere dokumenty, kde se hodnota pole rovná jakékoli hodnotě v zadaném poli.
$in
Operátor dotazu nelze zaměňovat s $in
operátor agregačního kanálu, který vrací boolean označující, zda je zadaná hodnota v poli.
Příklad
Předpokládejme, že máme kolekci nazvanou products
s následujícími dokumenty:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 4, "prod" : "Shirt", "sizes" : "M" } { "_id" : 5, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Můžeme použít $in
operátora, který vybere pouze dokumenty s konkrétním _id
hodnoty.
Příklad kódu:
db.products.find({
_id: { $in: [ 1, 2, 3 ] }
})
Výsledek:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
V tomto případě jsme chtěli pouze dokumenty, které obsahují _id
hodnotu 1
, 2
, nebo 3
.
Příklad 2
Zde je další příklad. Tentokrát používáme $in
proti jinému poli.
db.products.find({
sizes: { $in: [ "L" ] }
})
Výsledek:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
V tomto příkladu jsme použili $in
na sizes
pole.
V tomto případě měl první dokument hodnotu jako řetězec, zatímco další dva dokumenty ji měly jako prvek pole. V každém případě byly všechny odpovídající dokumenty vráceny.
Porovnání různých typů se vyhodnocují podle pořadí porovnání BSON.
Příklad agregace
Stejnou syntaxi můžeme použít při použití $match
operátor agregačního kanálu.
Příklad kódu:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } }
]
)
Výsledek:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
A tady je to znovu při dotazování na sizes
pole:
db.products.aggregate(
[
{ $match: { sizes: { $in: [ "L" ] } } }
]
)
Výsledek:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Regulární výrazy
V dotazu můžete použít regulární výrazy pomocí formuláře /pattern/
.
Příklad:
db.products.find({
sizes: { $in: [ /^X/ ] }
})
Výsledek:
{ "_id" : 5, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
V tomto příkladu vrátím všechny dokumenty, které mají sizes
pole s hodnotou, která je buď řetězcem začínajícím X
nebo pole, kde alespoň jeden z prvků začíná X
.