Sah*_*bov 8 javascript mongoose mongodb node.js express
以下代码仅适用于没有查询字符串或一个查询字符串.换句话说,只需/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);
});
Run Code Online (Sandbox Code Playgroud)
编辑: 嗯,我想我现在可以用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 });
});
Run Code Online (Sandbox Code Playgroud)
rvi*_*dal 10
您不需要Query#where
反复调用,因为您可以将所有条件传递给Mongoose Model#find as:
var filteredQuery = {},
acceptableFields = ['gender', 'race', /* etc */ ];
acceptableFields.forEach(function(field) {
req.query[field] && filteredQuery[field] = req.query[field];
});
var query = Character.find(filteredQuery);
Run Code Online (Sandbox Code Playgroud)
您还需要req.query
根据您所考虑的允许参数进行清理.
归档时间: |
|
查看次数: |
7260 次 |
最近记录: |