2016-08-12 67 views
3

我有文章和用户集合。 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)); 
+0

@chridam对不起我的坏,这是错字,纠正它。 – Xyroid

回答

1

只需使用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' }) 

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()查询,以便其recommened因此它只包含在你的架构中定义的字段在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); 
+0

要解决您的问题,我必须保持查询字符串参数键与* case sensitivity *的mongodb路径相同,是吗? – Xyroid

+0

正确,这意味着传入的任何'req.query'参数将被用作'find()'查询,因此它在'find()'方法中使用它之前推荐过滤'req.query',因此它只包含在您的模式中定义的字段。 – chridam

+0

但仍然没有解决空查询字符串问题。如果我要求'/ api/articles?userId = foo&title =',它会搜索空白标题的文章。 – Xyroid

相关问题