我有一个包含3个集合的论坛的数据库:主题,帖子,评论。 我有一个GET请求,要求返回一个个人论坛帖子,该帖子用每个帖子填充用户的帖子,每个用户帖子上都有任何评论,其工作方式如下所示: / p>
router.get('/:id', (req, res) => {
Threads
.findById(req.params.id)
.lean()
.populate({path: 'posts'})
.exec(function(err, docs){
var options = {
path: 'posts.comments',
model: 'comments'
};
if(err) return res.json(500);
Threads.populate(docs, options, function(err, thread){
res.json(thread);
})
})
})
当发出此GET请求时,它将返回一个论坛帖子,如下所示:
{
"_id": "5924ad549a08ed4e70a9c89f",
"title": "Testing Full Schemas",
"author": "Mongoose",
"content": "Schema Content",
"posts": [
{
"_id": "5924ad999a08ed4e70a9c8a0",
"content": "New Schema Post",
"user": "Mongodb",
"comments": [
{
"_id": "5924ae489a08ed4e70a9c8a1",
"comment": "New Schema Content",
"user": "Matt",
"likes": 0,
"created": "2017-05-25T12:41:58.319Z"
}
]
}
现在我需要一个GET请求来返回一个 ALL 线程数组(router.get(' /')),每个帖子的帖子和评论都要填充。我试图替换:
Threads
.findById(req.params.id)
与
Threads
.find(req.params.id)
但它不起作用。有没有人知道如何实现这一目标?
答案 0 :(得分:1)
要返回所有主题,只需使用find
而不包含任何match condition
。
此外,populate posts
查询本身中的'posts.comment'
和find
,您也不需要在callback
的{{1}}中执行此操作。
在多个级别使用人口
**试试这个:
find
阅读Mongoose Documentation on Populate and Nested Population了解详细信息。 (搜索跨多个级别填充)
答案 1 :(得分:0)
findById 和 findOne 返回单个文档,其中 find 返回光标。一旦找到find的光标,您就结束了,没有其他文档了。
使用查找查询:-
ModelName.find({_id:req.params.id})
.populate({
path:'posts',
populate :{
path : comments
}
},(error,data)=>{
if(error){
res.json(error);
}
else{
res.json(data);
}
})
使用findById查询:-
ModelName.findById(req.params.id)
.populate({
path:'posts',
populate :{
path : comments
}
},(error,data)=>{
if(error){
res.json(error);
}
else{
res.json(data);
}
})