Så længe du er klar over, at du matcher på ObjectId og faktisk ikke noget i den refererede samling, kan du bruge $in
operatør:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Hvor det selvfølgelig er dine faktiske ObjectId-værdier.
Men hvis du virkelig mener et dokument, der har præcis det array, så passerer du bare i arrayet:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Og hvis det skal have begge elementer, men kunne have andre, skal du i øjeblikket bruge en $og
udtryk:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Men fra version 2.6 og frem kan du korrekt bruge $all
operatør til effektivt at gøre det samme:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Den anden form matcher kun disse to elementer, men i vilkårlig rækkefølge. Så der er to tilgange:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Dette bruger en logisk $or
at sige, at arrayet skal være nøjagtigt, men kan arrangeres på begge måder. Og den anden tilgang:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Så dette ville bruge $size
for at sikre, at når arrayet indeholdt begge de elementer, der matchede, havde det også kun to elementer. Hvilket er en pænere syntaks end at bruge $or
, især for større arrays.
Og i fremtidige udgivelser bliver dette som nævnt endnu renere:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Det dækker nogenlunde enhver fortolkning