W MongoDB $in
operator zapytania wybiera dokumenty, w których wartość pola jest równa dowolnej wartości w określonej tablicy.
$in
operatora zapytania nie należy mylić z $in
operator potoku agregacji, który zwraca wartość logiczną wskazującą, czy określona wartość znajduje się w tablicy.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującymi dokumentami:
{ "_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" ] }
Możemy użyć $in
operatora, aby wybrać tylko te dokumenty z określonym _id
wartości.
Przykładowy kod:
db.products.find({
_id: { $in: [ 1, 2, 3 ] }
})
Wynik:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
W tym przypadku chcieliśmy tylko dokumentów, które zawierają _id
wartość 1
, 2
lub 3
.
Przykład 2
Oto kolejny przykład. Tym razem używamy $in
na innym polu.
db.products.find({
sizes: { $in: [ "L" ] }
})
Wynik:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
W tym przykładzie zastosowaliśmy $in
do sizes
pole.
W tym przypadku pierwszy dokument miał wartość w postaci łańcucha, podczas gdy pozostałe dwa dokumenty miały ją jako element tablicy. Tak czy inaczej, wszystkie pasujące dokumenty zostały zwrócone.
Porównanie różnych typów jest oceniane zgodnie z kolejnością porównania BSON.
Przykład agregacji
Możemy użyć tej samej składni przy użyciu $match
operator potoku agregacji.
Przykładowy kod:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } }
]
)
Wynik:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
I oto znowu podczas zapytania o sizes
pole:
db.products.aggregate(
[
{ $match: { sizes: { $in: [ "L" ] } } }
]
)
Wynik:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Wyrażenia regularne
Możesz użyć wyrażeń regularnych w zapytaniu, używając formularza /pattern/
.
Przykład:
db.products.find({
sizes: { $in: [ /^X/ ] }
})
Wynik:
{ "_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" ] }
W tym przykładzie zwracam wszystkie dokumenty, które mają sizes
pole z wartością, która jest ciągiem znaków zaczynającym się od X
lub tablica, w której co najmniej jeden z elementów zaczyna się od X
.