sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongoose obtiene documentos que coinciden con la matriz

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