以下代码适用于无 查询字符串或仅适用于一个 查询字符串。换句话说,只需转到 /characters
即可返回所有字符。但是,如果您要指定查询字符串参数 /characters?gender=male
,它将仅返回男性字符。
我如何扩展它以使用1、2、3 或无 查询字符串? 我真的希望避免为每个案例编写 8 或 9 个不同的 if 语句。我希望 Mongoose 会简单地忽略 $where 子句,如果它是 null
或 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 });
});
最佳答案
您不需要重复调用Query#where
,因为您可以将所有条件传递给Mongoose Model#find。作为:
var filteredQuery = {},
acceptableFields = ['gender', 'race', /* etc */ ];
acceptableFields.forEach(function(field) {
req.query[field] && filteredQuery[field] = req.query[field];
});
var query = Character.find(filteredQuery);
您还需要根据您考虑的允许参数清理 req.query
。
关于javascript - 如何在 Mongoose 中构建条件查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693029/