代码:
服务器侧
/**
* List of Articles
*/
exports.list = function (req, res) {
Article.find({ 'user.displayName': 'GIGANTOR !' }).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(articles);
}
});
};
状况:
我上面尝试的内容不起作用。我查看了mongoose文档:http://mongoosejs.com/docs/queries.html
但似乎无法使查询生效。目前,查询只返回任何内容。
问题:
如何查询具有特定displayName
的用户的所有文章?
答案 0 :(得分:1)
TL; DR您无法通过属于已填充对象的字段查询文档。
由于article
只有一个ref
到User
,您只需获取所有文章,然后在内存中过滤它们。或者,由于article.user
字段是_id
,您可以按用户ID查找文章(但您的问题是询问是否user.displayName
找到它们。)
Mongoose populate
不在MongoDB服务器本身进行填充;它填充在应用程序服务器上。这意味着正在进行多次数据库往返(参见文章Understanding Mongoose Population。)因此,您无法通过作为已填充对象的一部分存在的字段进行查询。
所以,这是你的2个解决方案:
Article.find({}).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
let filteredArticles = articles
.filter(article => article.user.displayName === 'GIGANTOR !');
res.json(filteredArticles);
}
});
或者,如果您可以_id
进行查询,则可以执行以下操作:
Article.find({ user: 'somemongoobjectidofuser' }).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(articles);
}
});
它有点毛茸茸,超出了问题的范围,但另一个解决方案是aggregation pipeline,它通常只推荐用于后端分析。但是,它会为您的查询提供更大的灵活性(特别是如果您使用MongoDB的新$graphLookup
)。
或者,您始终可以将用户的副本存储为文章文档本身内的非规范化对象,但是您会遇到讨论中非正规化文档同步维护的问题。
答案 1 :(得分:0)
只需将我最终使用的代码放在可能需要它的人身上:
/**
* List of Articles
*/
exports.list = function (req, res) {
Article.find({ user: req.user._id.toString() }).sort('-created').populate('user', 'displayName').exec(function (err, articles) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(articles);
}
});
};