Me di cuenta con el controlador node, express y mongo si un req.query.x/y... no está definido, ¡me devuelve inválido durante una búsqueda! ejemplo:
//req.query.name //req.query.email //req.query.city var search = req.query.search; //used in the main serch box //used as secondary textbox filters if(req.query.name){ var name = req.query.name; } if(req.query.email){ var email= req.query.email; } if(req.query.city){ var city= req.query.city; }durante una búsqueda en varios cuadros de texto, ¡me gustaría eliminar las condiciones if tanto como sea posible!
en .ejs
//textbox filter <input type="text" name="name"> <input type="text" name="email"> <input type="text" name="city">en .js
collection.find({ $text: {$search: search}, or:[{ name:{$regex: '^'+name}, email:{$regex: '^'+email}, city:{$regex: '^'+city}} ] }).toArray(function....... ¡Simplifiqué mucho el código para llegar al punto de la situación (pero no creo que el problema se refiera a $and o $or y su estructura|posición)! sin embargo, si una de las condiciones de búsqueda no está definida , no obtengo el resultado deseado, me gustaría entender si es posible excluir la city el name o el email en caso de que no haya valores asignados. como podria hacer no puedo usar req.query porque coincide con un cuadro de búsqueda más alto . en pocas palabras estas tres casillas estarían filtrando desde un texto req.query.search
Intenté eso pero sin éxito:
if(name == undefined ){ name ="";} if(email == undefined{ email="";} if(city==undefined){ city="";}gracias a quien me responda
Puede crear su objeto de filtro y luego pasarle sus propiedades en función de si no están definidas o no; puedes intentarlo de esta manera:
const { search, name, email, city, } = req.query; const filter = { $text: { $search: search }, $or: [], }; if (name) filter.$or.push({ name: new RegExp(name, 'i') }); // The 'i' flag is just for example purpose, that's all if (name) filter.$or.push({ email: new RegExp(email, 'i') }); // same here if (name) filter.$or.push({ city: new RegExp(city, 'i') }); // same here const result = await collection.find(filter);PD: está usando la palabra clave $texto, no sé si agregó un índice de texto a su definición de esquema Mongoose que le permite usar el operador $texto en sus consultas de búsqueda para buscar todos los campos incluidos en el índice de texto. Puedes leer más sobre esto aquí .
Gracias por el consejo, parece que lo solucioné así (esperemos que no se me escape nada)
var search = req.query.search; //used in the main serch box //used as secondary textbox filters if(req.query.name){ var name = req.query.name; } else if(name === undefined){name ="";}//add this if(req.query.email){ var email= req.query.email; } else if(email === undefined){email="";}//add this if(req.query.city){ var city= req.query.city; } else if(city === undefined){city="";}//add thisSi hay una mejor manera, ¡que así sea!