javascript - 如何在 Mongoose 中构建条件查询?

标签 javascript node.js mongodb express mongoose

以下代码适用于 查询字符串或仅适用于一个 查询字符串。换句话说,只需转到 /characters 即可返回所有字符。但是,如果您要指定查询字符串参数 /characters?gender=male,它将仅返回男性字符。

我如何扩展它以使用123 查询字符串? 我真的希望避免为每个案例编写 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 语句来完成。除非有人找到更优雅的解决方案。

编辑 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。作为:

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

关于javascript - 如何在 Mongoose 中构建条件查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693029/

相关文章:

javascript - 如何告诉 bxslider 更改最小图像数量?

javascript - Nodegit 克隆不起作用?

node.js - 模式是否必须完全匹配才能返回任何内容? ( Mongoose )

php - 如何比较 Node.js 与 Apache 上的 PHP 的性能

javascript - 返回某种类型的有限数量的记录,但返回无限数量的其他记录?

java - mongodb连接抛出MongoSocketReadException

javascript - 如何在单击复选框时调用 2 个函数?

javascript - 通过正则表达式将单引号更改为双引号。 (单字)

javascript - Vuejs 2.x 单击非 ul 链接时如何删除事件类

MongoDB 空查询异常