Estoy tratando de descubrir cómo funcionan Mongoose y MongoDB ... Soy realmente nuevo en ellos, y parece que no puedo entender cómo devolver valores basados en una declaración de búsqueda, donde algunos de los parámetros dados en la consulta los posibles son nulos: ¿hay algún atributo que pueda establecer para esto o algo así?
Para explicarlo más, tengo una página web que tiene diferentes campos de entrada que se usan para buscar una empresa, sin embargo, no todos son obligatorios.
var Company = mongoose.model('Company'); Company.find({companyName: req.query.companyName, position: req.query.position, areaOfExpertise: req.query.areaOfExpertise, zip: req.query.zip, country: req.query.country}, function(err, docs) { res.json(docs); }); Al completar todos los campos de entrada en la página web, obtengo un resultado, pero solo el específico que coincide. Digamos que solo completo el country , no devuelve nada porque el resto está vacío, pero deseo devolver todas las filas que están, por ejemplo, en Alemania. Espero haberme expresado con suficiente claridad.
Debe envolver las consultas con el operador lógico $or , por ejemplo
var Company = mongoose.model('Company'); Company.find( { "$or": [ { "companyName": req.query.companyName }, { "position": req.query.position }, { "areaOfExpertise": req.query.areaOfExpertise }, { "zip": req.query.zip }, { "country": req.query.country } ] }, function(err, docs) { res.json(docs); } ); Otro enfoque sería construir una consulta que verifique los parámetros vacíos, si no son nulos, incluirlos como parte de la consulta. Por ejemplo, puede usar el objeto req.query como su consulta, suponiendo que las claves sean las mismas que el campo de su documento, como se muestra a continuación:
/* the req.query object will only have two parameters/keys eg req.query = { position: "Developer", country: "France" } */ var Company = mongoose.model('Company'); Company.find(req.query, function(err, docs) { if (err) throw err; res.json(docs); }); En lo anterior, el objeto req.query actúa como la consulta y tiene una operación AND lógica implícita ya que MongoDB proporciona una operación AND implícita al especificar una lista de expresiones separadas por comas. El uso de un AND explícito con el operador $and es necesario cuando se debe especificar el mismo campo u operador en varias expresiones.
Si está buscando una consulta que satisfaga tanto AND lógico como OR , es decir, devuelva todos los documentos que coincidan con las condiciones de ambas cláusulas, por ejemplo, dada una consulta de position Y country O cualquier otro campo, entonces puede modificar la consulta para:
var Company = mongoose.model('Company'); Company.find( { "$or": [ { "companyName": req.query.companyName }, { "position": req.query.position, "country": req.query.country }, { "areaOfExpertise": req.query.areaOfExpertise }, { "zip": req.query.zip } ] }, function(err, docs) { res.json(docs); } );pero, de nuevo, esto podría estar sujeto a qué parámetros de consulta deben unirse como obligatorios, etc.
Simplemente terminé eliminando los parámetros en la consulta en caso de que estuvieran vacíos. Parece que todos los campos de texto en el envío se envían como "" (vacío). Como no hay tales valores en la base de datos, no devolvería nada. Tan simple que nunca se me pasó por la cabeza...
Ejemplo:
if (req.query.companyName == "") { delete req.query.companyName; }