如果条件变量为空,如何返回所有记录?

时间:2016-08-12 06:39:11

标签: javascript node.js mongodb mongoose

我有文章和用户集合。 userId位于文章模型中,数据类型为Schema.ObjectId。在一个视图中,我显示所有文章,并在顶部我显示所有用户的下拉列表来过滤文章。如果选择了下拉列表的占位符,则将返回所有文章,如果选择了任何用户,则将返回该用户的文章。我的API代码如下。当选择下拉列表的占位符时,UserId查询字符串将具有空值,否则将具有任何现有用户的ID。

exports.list = function (req, res) {
    var userId = '';
    if (req.query.UserId) {
        userId = req.query.UserId;   
    }
    Article.find({userId: userId}).exec(function (err, articles) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(articles);
        }
    });
};

现在问题是我无法返回所有文章,因为当查询字符串参数为空时,查询会尝试查找那些userId为空白的文章。那么如果条件参数为空或为空,我怎样才能跳过条件检查?

我想做同下面给出的,即C#LINQ查询。

var userId = <value from query string>;
var lstArticles = dbContext.Articles.Where(objArticle => (userId == '' || objArticle.userId == userId));

1 个答案:

答案 0 :(得分:1)

只需使用 req.query 对象,因为它是一个对象,其中包含路径中每个查询字符串参数的属性。如果没有查询字符串,则它是空对象{}

E.g

// GET /api/articles?userId=57ac922c457312e0e5c1ad6c
req.query.userId
// => "57ac922c457312e0e5c1ad6c"

// GET /api/articles?userId=57ac922c457312e0e5c1ad6c
req.query
// => { "userId": "57ac922c457312e0e5c1ad6c" }  

// GET /api/articles
req.query.userId
// => undefined

// GET /api/articles
req.query
// => {}

因此

exports.list = function (req, res) {
    var q = req.query;
    if (req.query.UserId) {
        q.user = req.query.UserId; // because you have a different key in your database  
    }
    Article.find(q).exec(function (err, articles) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(articles);
        }
    });
};

<强> - 编辑 -

由于您已在user中的{ user: userId }密钥中更正了问题中的拼写错误,因此您只需使用 req.query 对象作为您的mongoose查找查询文档,只要属性( req.query 参数)与数据库文档字段中的属性匹配:

路线

/api/articles                         → Article.find({ })
/api/articles?userId=foo              → Article.find({ userId: 'foo' })
/api/articles?title=bar               → Article.find({ title: 'bar' })
/api/articles?userId=foo&title=bar    → Article.find({ userId: 'foo', title: 'bar' })

<强> API

exports.list = function (req, res) {        
    Article.find(req.query).exec(function (err, articles) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(articles);
        }
    });
};

上述方法表示传入的任何 req.query 参数都将用作find()查询,因此建议过滤 req.query find()方法中使用它之前,它只包含在模式中定义的字段。

例如,假设 req.query 对象具有user参数,但您在架构中定义了userId字段,则可以将其过滤为:

var q = {};
if (req.query.user) {
    q.userId = req.query.user; // because you have a different key in your database  
}
Article.find(q).exec(callback);