如何在Mongoose中build立条件查询?

下面的代码只适用于没有 querystrings或一个查询string。 换句话说,简单地去/characters返回所有字符。 但是,如果你要指定查询string参数/characters?gender=male ,它将只返回男性angular色。

我怎么能扩展这个工作1,2,3或者没有 querystrings? 我真的希望避免为每个案例写8或9个不同的if语句 。 我希望Mongoose会忽略$ where子句,如果它是nullundefined ,但情况并非如此(请参阅注释代码)。

  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语句来做。 除非有人find更优雅的解决scheme。

编辑2:

多谢你们。 select一个答案很困难,因为你们都帮助我实现了这个简洁的解决scheme。 现在是整个事情。

 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

好,

我会推荐这样的东西:

 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 } 

这不是我的testing,但它应该工作(也许你需要修改一下,但你明白了)。 这个解决scheme是关于不检查参数实际是什么,所以确保只有好东西进来或在for循环中的某个地方validation它,但会需要一些正则expression式或if语句。

希望这可以帮助你。