以下代码仅适用于否查询字符串或一个查询字符串。换句话说,只需转到/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 });
});
答案 0 :(得分:10)
您无需反复拨打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
。
答案 1 :(得分:2)
那么,
我会推荐这样的东西:
var query = Character.find()
if(req.params.length < 0) {
for(var key in req.params) {
query.where(req.params[key]).equals(key);
}
} else {
// do something without query params
}
这不是我测试但它应该工作(也许你需要修改它,但你明白了)。这个解决方案就是不检查params中究竟是什么,所以确保只有好东西进来或在for循环中的某个地方验证它,但是需要一些正则表达式或if语句。
希望这会对你有所帮助。
答案 2 :(得分:1)
我正在通过销毁对象来完成这项任务。
const filter = req.query.filter ? { _id: { $in: req.query.filter.split(',') } } : {};
const category = req.query.category ? { category: req.query.category } : {};
// more variables that you need and are empty objects if don't exist
const all = await Post.find({ ...filter, ...category }).exec();