I MongoDB, $in
frågeoperatorn väljer de dokument där värdet på ett fält är lika med valfritt värde i den angivna arrayen.
$in
frågeoperatorn ska inte förväxlas med $in
aggregeringspipeline-operator, som returnerar en boolean som indikerar om ett angivet värde finns i arrayen.
Exempel
Anta att vi har en samling som heter products
med följande dokument:
{ "_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" ] }
Vi kan använda $in
operatör för att välja just de dokument med specifik _id
värden.
Exempelkod:
db.products.find({
_id: { $in: [ 1, 2, 3 ] }
})
Resultat:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
I det här fallet ville vi bara ha dokument som innehåller ett _id
värdet 1
, 2
eller 3
.
Exempel 2
Här är ett annat exempel. Den här gången använder vi $in
mot ett annat fält.
db.products.find({
sizes: { $in: [ "L" ] }
})
Resultat:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
I det här exemplet använde vi $in
till sizes
fält.
I det här fallet hade det första dokumentet värdet som en sträng, medan de andra två dokumenten hade det som ett matriselement. Oavsett vilket, alla matchande dokument returnerades.
Jämförelser av olika typer utvärderas enligt BSON-jämförelseordningen.
Aggregationsexempel
Vi kan använda samma syntax när vi använder $match
aggregeringspipeline-operatör.
Exempelkod:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } }
]
)
Resultat:
{ "_id" : 1, "prod" : "Shorts" } { "_id" : 2, "prod" : "Jeans", "sizes" : null } { "_id" : 3, "prod" : "Shirt", "sizes" : "L" }
Och här är den igen när du frågar efter sizes
fält:
db.products.aggregate(
[
{ $match: { sizes: { $in: [ "L" ] } } }
]
)
Resultat:
{ "_id" : 3, "prod" : "Shirt", "sizes" : "L" } { "_id" : 6, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 7, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Reguljära uttryck
Du kan använda reguljära uttryck i frågan genom att använda formen /pattern/
.
Exempel:
db.products.find({
sizes: { $in: [ /^X/ ] }
})
Resultat:
{ "_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" ] }
I det här exemplet returnerar jag alla dokument som har en sizes
fält med ett värde som antingen är en sträng som börjar med X
eller en array där minst ett av elementen börjar med X
.