Si tengo este esquema ...
person = {
name : String,
favoriteFoods : Array
}
... donde la favoriteFoods
matriz se llena con cadenas. ¿Cómo puedo encontrar a todas las personas que tienen "sushi" como su comida favorita usando mangosta?
Esperaba algo en la línea de:
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(Sé que no hay $contains
mongodb, solo explicando lo que esperaba encontrar antes de conocer la solución)
favouriteFoods
es:favouriteFoods:[{type:Schema.Types.ObjectId, ref:'Food'}]
PersonModel.find({ favouriteFoods.text: "sushi" }, ...); person = { name : String, favouriteFoods : [{text:String}] }
No hay
$contains
operador en mongodb.Puede usar la respuesta de JohnnyHK ya que funciona. La analogía más cercana a contiene que tiene Mongo es
$in
, usando esto su consulta se vería así:fuente
$in
se usa cuando tiene varios valores de consulta y el documento debe coincidir con uno de ellos. Para el reverso (que es de lo que trata esta pregunta), la respuesta de JohnnyHK es correcta. Iba a votar en contra, pero supongo que esta respuesta puede ser útil para otras personas que terminan en esta página.PersonModel.find({favouriteFoods: {"$in": ["sushi", "hotdog"]}})
Siento
$all
que sería más apropiado en esta situación. Si buscas a una persona que le guste el sushi, lo haces:Como es posible que desee filtrar más su búsqueda, así:
$in
es como OR y$all
como AND. Verifique esto: https://docs.mongodb.com/manual/reference/operator/query/all/fuente
En caso de que la matriz contenga objetos, por ejemplo, si
favouriteFoods
es una matriz de objetos de lo siguiente:puedes usar la siguiente consulta:
fuente
En caso de que necesite encontrar documentos que contengan elementos NULL dentro de una matriz de subdocumentos, he encontrado esta consulta que funciona bastante bien:
Esta consulta está tomada de esta publicación: matriz de consulta MongoDb con valores nulos
Fue un gran hallazgo y funciona mucho mejor que mi propia versión inicial e incorrecta (que resultó funcionar bien solo para matrices con un elemento):
fuente
Aunque estar de acuerdo con find () es más efectivo en su caso de uso. Todavía hay $ match de marco de agregación, para facilitar la consulta de una gran cantidad de entradas y generar una baja cantidad de resultados que tienen valor para usted, especialmente para agrupar y crear nuevos archivos.
fuente
En caso de lookup_food_array es matriz.
En caso de lookup_food_array es string.
fuente
Para Loopback3, todos los ejemplos dados no funcionaron para mí, o tan rápido como usar REST API de todos modos. Pero me ayudó a encontrar la respuesta exacta que necesitaba.
{"where":{"arrayAttribute":{ "all" :[String]}}}
fuente
Si desea usar algo como un operador "contiene" a través de javascript, siempre puede usar una expresión regular para eso ...
p.ej. Digamos que desea recuperar un cliente que tenga "Bartolomew" como nombre
fuente
Sé que este tema es antiguo, pero para las personas futuras que podrían preguntarse la misma pregunta, otra solución increíblemente ineficiente podría ser:
Esto evita todas las optimizaciones de MongoDB, por lo que no debe usarse en el código de producción.
fuente