使用Mongoose以编程方式构builddynamic查询

我试图从input接收从一个表单build立一个search。

router.get('/data', function(req, res) { var firstName=req.body.firstName, lastName=req.body.lastName, companyName=req.body.companyName, email=req.body.email; }); 

我想从这些值build立一个查询,但如果该字段没有价值,我显然不希望将其包括在search(search“”会改变结果)

我尝试了几个不同的东西,比如build立一个string放在:

 mongoose.model('customers').find({QUERY STRING WOULD GO HERE} ,function(err, data) { if (err) return console.error(err); console.log(data); }); 

但是,这似乎并没有正常工作。 我也尝试“堆叠”像这样的search查询:

 if(firstName !="") { mongoose.model('customers').find({firstName: firstName}) } 

然后像这样执行search:

 mongoose.model('customers').exec(function(err, customer){ console.log(customer); }); 

但是,这会导致500错误(我不确定是否有任何更多的信息,我可以从他们得到)。

请帮助新手dynamicbuild立一个mongoosesearch查询:(

       

网上收集的解决方案 "使用Mongoose以编程方式构builddynamic查询"

尝试创buildquery对象,如:

 //generate query object based on availability of value var query = {}; if( your_variable !== "" ) { query["some_key"] = your_variable; } if( your_second_variable !== "" ) { query["some_other_key"] = your_second_variable; } mongoose.model('customers').find(query, function(err, c) { //do something }); 

为了避免独立检查每个参数,可以循环遍历它们。

 var query = {}; for(var key in req.body){ //could also be req.query and req.params req.body[key] !== "" ? query[key] = req.body[key] : null; } mongoose.model('customers').find(query, function(err, customers){ }) 

对于使用较新JavaScript的人(特别是在Node.js 7.6.0+或Babel上)。

我发现以编程方式构build查询(基于if子句等)的最佳方式是使用查询和替代语法。

 let query = PersonModel().find(); if (isMale) { query.where('sex', 'male'); } else { query.where('sex', 'female'); } query.where('alive', true); // and then to run the query const result = await query.exec(); 

请注意这里的async/await用法。 它在Node.js 7.6.0+上完美运行。 如果你不想使用async/await你可以使用Promise像这样:

 query.exec().then(result => { // result has your... results });