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

How to return all the record if condition variable is empty?

本文关键字:返回 记录 何返回 变量 条件 如果      更新时间:2023-09-26

我有文章和用户集合。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为空白的文章。那么,如果条件参数为空或null,我如何跳过条件检查?

我想做和下面给出的一样,这是c# LINQ查询。

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

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

// 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: userId }中纠正了user键的问题中的错字,你可以简单地使用 req.query 对象作为你的猫鼬查找查询文档,只要属性( 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' })

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()查询,因此建议在find()方法中使用 req.query 之前过滤它,以便它只包含在模式中定义的字段。

例如,假设 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);