[英]How to build a conditional query in Mongoose?
以下代碼僅適用於沒有查詢字符串或一個查詢字符串。 換句話說,只需轉到/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 as:
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
。
好,
我會推薦這樣的東西:
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語句。
希望這對你有所幫助。
我正在使用對象的破壞來完成這項任務。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.