Finché ti rendi conto che stai corrispondendo su ObjectId e in realtà non nulla nella raccolta di riferimento, puoi utilizzare $in
operatore:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Dove ovviamente quelli sono i tuoi valori ObjectId effettivi.
Ma se intendi davvero un documento che ha esattamente quell'array, devi semplicemente passare l'array:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
E se deve avere entrambi gli elementi ma potrebbe averne altri, al momento è necessario utilizzare un $and
espressione:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Ma dalla versione 2.6 in poi puoi usare correttamente $all
operatore per fare lo stesso in modo efficace:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
L'altra forma corrisponde solo a questi due elementi, ma in qualsiasi ordine. Quindi ci sono due approcci:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Questo utilizza un $or
per dire che l'array deve essere esatto ma può essere organizzato in entrambi i modi. E l'altro approccio:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Quindi questo userebbe $size
per assicurarsi che quando l'array conteneva entrambi gli elementi corrispondenti, anche quello ne avesse solo due elementi. Che è una sintassi migliore rispetto all'utilizzo di $or
, soprattutto per array più grandi.
E nelle versioni future, come accennato, questo diventa ancora più pulito:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Questo copre praticamente ogni interpretazione