Solange Sie erkennen, dass Sie mit der ObjectId und nicht mit irgendetwas in der referenzierten Sammlung übereinstimmen, können Sie den $in
Betreiber:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Wobei das natürlich Ihre tatsächlichen ObjectId-Werte sind.
Aber wenn Sie wirklich ein Dokument meinen, das genau dieses Array hat, dann übergeben Sie einfach das Array:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Und wenn es beide Elemente haben muss, aber andere haben könnte, müssen Sie derzeit ein $and
Ausdruck:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Aber ab Release 2.6 und höher können Sie den ordnungsgemäß verwenden $all
Operator, um dasselbe effektiv zu tun:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Das andere Formular gleicht nur diese beiden Elemente ab, aber in beliebiger Reihenfolge. Es gibt also zwei Ansätze:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Dies verwendet einen logischen $or
zu sagen, dass das Array genau sein muss, aber in beide Richtungen angeordnet werden kann. Und der andere Ansatz:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Dies würde also $size
verwenden
um sicherzustellen, dass, wenn das Array beide übereinstimmenden Elemente enthielt, es auch nur zwei hatte Elemente. Das ist eine schönere Syntax als die Verwendung von $or
, insbesondere für größere Arrays.
Und in den zukünftigen Versionen wird dies, wie erwähnt, noch sauberer:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Das deckt so ziemlich jede Interpretation ab