Contanto que você perceba que está correspondendo no ObjectId e não em nada na coleção referenciada, você pode usar o
$in
operador:db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Onde, claro, esses são seus valores reais de ObjectId.
Mas se você realmente quer dizer um documento que tem exatamente essa matriz, basta passar a matriz:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
E se ele deve ter os dois elementos, mas pode ter outros, atualmente você precisa usar um
$e
expressão:db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Mas a partir da versão 2.6 em diante, você pode usar corretamente o
$all
operador para efetivamente fazer o mesmo:db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
A outra forma corresponde apenas a esses dois elementos, mas em qualquer ordem. Portanto, existem duas abordagens:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Isso usa um
$or
lógico
dizer que a matriz deve ser exata, mas pode ser organizada de qualquer maneira. E a outra abordagem:db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Portanto, isso usaria
$size
para garantir que, quando a matriz continha os dois elementos correspondentes, também havia apenas dois elementos. Qual é uma sintaxe melhor do que usar $or
, especialmente para matrizes maiores. E nas versões futuras, como mencionado, isso fica ainda mais limpo:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Isso cobre praticamente todas as interpretações