Siempre que se dé cuenta de que está haciendo coincidir el ObjectId y en realidad no hay nada en la colección a la que se hace referencia, puede usar $in
operador:
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Donde, por supuesto, esos son sus valores reales de ObjectId.
Pero si realmente te refieres a un documento que tiene exactamente esa matriz, simplemente pasa la matriz:
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Y si debe tener ambos elementos pero podría tener otros, actualmente necesita usar un $and
expresión:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Pero desde la versión 2.6 en adelante, puede usar correctamente el $all
operador para hacer lo mismo efectivamente:
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
La otra forma es hacer coincidir solo esos dos elementos, pero en cualquier orden. Así que hay dos enfoques:
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Esto utiliza un lógico $or
decir que la matriz debe ser exacta pero se puede organizar de cualquier manera. Y el otro enfoque:
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Entonces esto usaría $size
para asegurarse de que cuando la matriz contenía los dos elementos que coincidían, también solo tenía dos elementos. Que es una sintaxis mejor que usar $or
, especialmente para arreglos más grandes.
Y en los lanzamientos futuros, como se mencionó, esto se vuelve aún más claro:
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Eso cubre prácticamente todas las interpretaciones