次のコードは、クエリ文字列なし、または1 つのクエリ文字列のみで機能します。言い換えれば、単に行くだけで/characters
すべての文字が返されます。ただし、クエリ文字列パラメーターを指定すると、/characters?gender=male
男性の文字のみが返されます。
1、2、3、またはクエリ文字列なしで動作するようにこれを拡張するにはどうすればよいですか? ケースごとに8つまたは9つの異なるifステートメントを書くことは本当に避けたいと思います。$where句がnull
orの場合、Mongoose が単純に無視することを期待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:
みんなありがとう。この簡潔な解決策を達成するためにあなたの両方が私を助けてくれたので、1つの答えを選ぶのは難しいです. これが今の全体です。
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 });
});