2015-04-06 82 views
9

我试图从输入接收从窗体生成搜索。以编程方式构建动态查询与猫鼬

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

我想从这些数值构建查询,但如果字段没有价值,我显然不希望把它列入搜索(搜索“”会改变结果)

我已经尝试了几个不同的东西,比如建立一个字符串的地方:

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

但是,这似乎并没有正常工作。我也试过这样的“叠加”的搜索查询:

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

,然后执行这样的搜索:

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

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

请帮助新手动态地构建一个猫鼬的搜索查询:(

+0

取而代之的是查询字符串的,你尝试构造查询对象? (如果你是JavaScript新手,其他语言称之为“哈希”或“映射”或“数组”) – slebetman 2015-04-06 06:27:40

+0

@slebetman你是完全正确的。我查找了如何创建一个对象,但只是没有做好它:( – 2015-04-06 20:27:48

回答

16

尝试创建query对象,如:

//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 
}); 
+0

我做到了这一点,它的工作!我试图让一个对象错了整个时间!谢谢你帮助我! – 2015-04-06 20:32:30

+0

完美的作品! – user3344977 2016-07-18 02:22:28

+0

嗨DemoUser, 如果我想把'在'检查如何使用上面的一个,意味着我想检查这个{用户名:{$ in:['x','y','z']}}。在这种情况下,第一个变量和第二个变量是什么。 – RamBen 2016-09-21 05:44:33

2

为了避免独立检查每个参数可以循环通过他们

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){ 

}) 
+0

这非常有帮助,谢谢!我已经在我的应用程序的其他地方完成了这个任务,并且它非常有帮助! – 2017-03-28 16:46:50

2

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

我发现以编程方式构建查询(基于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你可以使用承诺,像这样:

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

感谢您的输入!我的用例简单得多不过,我非常感谢它!我确信有人会很好地使用它! – 2017-03-28 16:46:16