如何无限填充mongoDB模型?

时间:2018-12-27 04:23:05

标签: node.js mongodb express

我试图找到一种在mongoDB中无限填充的方法。我有一个Posts集合,其中包含对象ID的注释数组。每个评论还具有一个childComment ID数组。我可以嵌套两个填充,但是此注释系统与Reddit相似,因为可以有无限数量的嵌套注释。

router.get('/', (req, res) => {
  Post.find()
    .populate({
      path: 'postComments',
      populate: {
        path: 'commentComments'
      }
     })
    .sort({ date: -1 })
    .then(posts => res.json(posts))
    .catch(err => res.status(404)
      .json({ nopostsfound: 'No posts found'}));
});

我希望找到一种方法,使commentComments的填充将继续容纳尽可能多的嵌套注释。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

这是一个固有问题的数据库架构。对架构进行一些更改将使您的任务更加轻松。

不要在Post或Comment对象中存储评论ID数组。当数组变得非常大时,或者当许多客户端需要立即更新父对象时,这将导致问题。

相反,在每个Comment对象中,存储它所属的Post的ID以及响应它的Comment的ID(如果有)。然后,要加载帖子的评论,请搜索属于该帖子的每个评论,并对结果对象执行topological sort

与您所描述的模式相比,该模式具有许多主要优点-该模式与传统的关系数据库兼容,可以在单个查询中检索帖子的所有注释,并且可以使用单插入查询。

答案 1 :(得分:0)

router.get('/', (req, res) => {
  Post.find()
    .populate([{
      path: 'postComments',
      populate: [{
        path: 'commentComments',
        populate: {
          path: 'childComments'
        }
      }]
     }])
    .sort({ date: -1 })
    .then(posts => res.json(posts))
    .catch(err => res.status(404)
      .json({ nopostsfound: 'No posts found'}));
});

您可以使用嵌套填充来无限填充。