以下代码不使用查询字符串或仅使用一个查询字符串。换句话说,只需/characters
返回所有字符。但是,如果您要指定查询字符串参数/characters?gender=male
,它将只返回男性字符。
我如何扩展它以使用1、2、3或没有查询字符串?我真的更愿意避免为每个 case 编写 8 或 9 个不同的 if 语句。我希望 Mongoose 会简单地忽略$where子句,如果它是null
or undefined
,但事实并非如此(请参阅注释掉的代码)。
var gender = req.query.gender;
var race = req.query.race;
var bloodline = req.query.bloodline;
var query = Character.find();
if (gender)
query = query.where('gender').equals(gender);
if (race)
query = query.where('race').equals(race);
if (bloodline)
query = query.where('bloodline').equals(bloodline);
/*
query
.where('gender').equals(new RegExp('^' + gender + '$', 'i'))
.where('race').equals(new RegExp('^' + race + '$', 'i'))
.where('bloodline').equals(new RegExp('^' + bloodline + '$', 'i'));
*/
query.exec(function(err, characters) {
if (err) throw err;
res.send(characters);
});
编辑: 好吧,我想我现在可以用 7 个 if 语句来做到这一点。除非有人找到更优雅的解决方案。
编辑2:
多谢你们。很难选择一个答案,因为你们俩都帮助我实现了这个简洁的解决方案。这就是现在的全部内容。
var conditions = {};
for (var key in req.query) {
if (req.query.hasOwnProperty(key)) {
conditions[key] = new RegExp('^' + req.query[key] + '$', 'i');
}
}
var query = Character.find(conditions);
query.exec(function(err, characters) {
if (err) throw err;
res.send({ characters: characters });
});