【发布时间】:2013-11-10 15:54:16
【问题描述】:
以下代码仅适用于 no 查询字符串或 one 查询字符串。换句话说,只需转到/characters 即可返回所有字符。但是如果你要指定一个查询字符串参数/characters?gender=male,它将只返回男性字符。
如何扩展它以使用 1、2、3 或 no 查询字符串? 我真的希望避免为每种情况编写 8 或 9 个不同的 if 语句。我希望 Mongoose 会简单地忽略 null 或 undefined 的 $where 子句,但事实并非如此(请参阅注释掉的代码)。
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 });
});
【问题讨论】:
-
没问题,但您应该选择一个答案让未来的用户知道哪个对您更有帮助。如果做不到,请考虑编写自己的答案并检查其是否正确。
-
你应该删除你的 Edit 2 并写下你自己的答案,这很好顺便说一句
-
非常好 - 效果很好;除了产生奇怪查询的正则表达式的卫生部分。
标签: javascript node.js mongodb express mongoose