Så länge du inser att du matchar på ObjectId och inte faktiskt någonting i den refererade samlingen kan du använda $in
operatör:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Där det naturligtvis är dina faktiska ObjectId-värden.
Men om du verkligen menar ett dokument som har exakt den arrayen, så skickar du bara in i arrayen:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Och om den måste ha båda elementen men kan ha andra måste du för närvarande använda en $and
uttryck:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Men från version 2.6 och framåt kan du korrekt använda $all
operatör för att effektivt göra detsamma:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Den andra formen matchar bara dessa två element, men i valfri ordning. Så det finns två tillvägagångssätt:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Detta använder en logisk $or
att säga att arrayen måste vara exakt men kan ordnas åt båda hållen. Och det andra tillvägagångssättet:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Så detta skulle använda $size
för att se till att när arrayen innehöll båda elementen som matchade så hade den bara två element. Vilket är en trevligare syntax än att använda $or
, speciellt för större arrayer.
Och i framtida utgåvor blir detta som sagt ännu renare:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Det täcker ganska mycket varje tolkning