Dopóki zdajesz sobie sprawę, że pasujesz do ObjectId, a nie do niczego w kolekcji, do której się odwołujesz, możesz użyć $in
operator:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Gdzie oczywiście są to twoje rzeczywiste wartości ObjectId.
Ale jeśli naprawdę masz na myśli dokument, który ma dokładnie taką tablicę, po prostu przekazujesz tablicę:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
A jeśli musi mieć oba elementy, ale może mieć inne, obecnie musisz użyć $i
wyrażenie:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Ale od wersji 2.6 i później można prawidłowo używać $wszystkie
operatora, aby skutecznie robić to samo:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
Druga forma to dopasowanie tylko tych dwóch elementów, ale w dowolnej kolejności. Są więc dwa podejścia:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Używa logicznego $or
powiedzieć, że tablica musi być dokładna, ale może być ułożona w dowolny sposób. I inne podejście:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Więc użyto by $size
aby upewnić się, że gdy tablica zawiera oba elementy, które pasują, to również ma tylko dwa elementy. Co jest ładniejszą składnią niż użycie $or
, szczególnie w przypadku większych tablic.
A w przyszłych wydaniach, jak wspomniano, stanie się to jeszcze czystsze:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
To dość dużo obejmuje każdą interpretację