我有文章和用户集合。 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 :(得分: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);