В MongoDB, $in
операторът за заявка избира документите, при които стойността на поле е равна на всяка стойност в посочения масив.
$in
операторът на заявка не трябва да се бърка с $in
оператор на конвейер за агрегиране, който връща булева стойност, показваща дали определена стойност е в масива.
Пример
Да предположим, че имаме колекция, наречена products
със следните документи:
{ "_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" ] }
Можем да използваме $in
оператор, за да изберете само тези документи със специфичен _id
стойности.
Примерен код:
db.products.find({
_id: { $in: [ 1, 2, 3 ] }
})
Резултат:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
В този случай искахме само документи, които съдържат _id
стойност на 1
, 2
, или 3
.
Пример 2
Ето още един пример. Този път използваме $in
срещу друго поле.
db.products.find({
sizes: { $in: [ "L" ] }
})
Резултат:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
В този пример приложихме $in
до sizes
поле.
В този случай първият документ имаше стойност като низ, докато другите два документа я имаха като елемент на масив. Така или иначе, всички съответстващи документи бяха върнати.
Сравненията на различни типове се оценяват според порядъка за сравнение на BSON.
Пример за агрегиране
Можем да използваме същия синтаксис, когато използваме $match
оператор на тръбопровод за агрегация.
Примерен код:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } }
]
)
Резултат:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
И ето го отново, докато запитвате sizes
поле:
db.products.aggregate(
[
{ $match: { sizes: { $in: [ "L" ] } } }
]
)
Резултат:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Регулярни изрази
Можете да използвате регулярни изрази в заявката, като използвате формата /pattern/
.
Пример:
db.products.find({
sizes: { $in: [ /^X/ ] }
})
Резултат:
{ "_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" ] }
В този пример връщам всички документи, които имат sizes
поле със стойност, която е или низ, който започва с X
или масив, където поне един от елементите започва с X
.