编写这个mongoose查询字符串的更好方法是什么?

时间:2014-09-19 18:15:22

标签: node.js mongodb mongoose

exports.all = function(req, res) {

  if(!req.query.questionid) {
    Answer.find().sort('-created').populate('creator', 'username').exec(function(err, answers) {
      if (err) {
        res.json(500, err);
      } else {
        res.json(answers);
      }
    });
  } else {
    Answer.find().sort('-created').where('questionid', req.query.questionid).populate('creator', 'username').exec(function(err, answers) {
      if (err) {
        res.json(500, err);
      } else {
        res.json(answers);
      }
    });
  }
};

我认为我很清楚我要尝试做什么 - 如果提供了查询参数,我想使用where过滤器进行查询,如果没有,那么我就不会&# 39;吨。必须有更好的方法来写这个......

2 个答案:

答案 0 :(得分:2)

使用querymen可以实现非常好的方法。

var querymen = require('querymen')

app.use('/', querymen.middleware({
  questionid: mongoose.Types.ObjectId,
  sort: '-created'
}))

app.get('/', function(req, res) {
  console.log(req.querymen) // {query: {questionid: <ObjectId>}, cursor: {sort: {created: -1}}}
  Answer.find(req.querymen.query, null, req.querymen.cursor)
    .populate('creator', 'username')
    .exec(function(err, answers) {
      if (err) {
        res.json(500, err);
      } else {
        res.json(answers);
      }
    })
})

答案 1 :(得分:1)

您可以稍微拆分您的调用链,以便只包含您需要的部分:

exports.all = function(req, res) {

  var query = Answer.find().sort('-created').populate('creator', 'username');

  if(req.query.questionid) {
    query = query.where('questionid', req.query.questionid);
  }

  query.exec(function(err, answers) {
    if (err) {
      res.json(500, err);
    } else {
      res.json(answers);
    }
  });
};