返回Mongoose中填充对象的数组

时间:2017-05-25 14:09:48

标签: mongodb mongoose populate

我有一个包含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)

但它不起作用。有没有人知道如何实现这一目标?

2 个答案:

答案 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);
}
})