node.js - 如何无限填充 mongoDB 模型?
问题描述
我正在尝试找到一种在 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 的填充将继续为尽可能多的嵌套评论。非常感谢任何帮助!
解决方案
这是一个固有的有问题的数据库模式。对模式的一些更改将使您的任务更容易。
不要在 Post 或 Comment 对象中存储评论 ID 数组。当数组变得非常大时,或者当许多客户端需要一次更新父对象时,这将导致问题。
相反,在每个 Comment 对象中,存储它所属的 Post 的 ID,以及它响应的 Comment(如果有)的 ID。然后,要加载帖子的评论,搜索属于该帖子的每个评论并对结果对象执行拓扑排序。
与您所描述的架构相比,此架构具有许多主要优点-该架构与传统的关系数据库兼容,可以在单个查询中检索帖子的所有评论,并且可以通过单个插入查询添加新评论.
推荐阅读
- java - 不确定是否最好将包装类或静态用于需要由多个线程查看的变量
- ios - 无法在 Swift5 中将类型“UnsafeRawPointer”的值转换为预期的参数类型“RawPointer”
- amazon-web-services - AWS Lambda CodePipeline 无法处理我的 deps.json 文件?
- angular - Forge viewer angular 中的简单几何创建示例
- javascript - 向频道发送消息
- leaflet - 检测'zoomstart'上的zoomIn或zoomOut
- python - 具有动态宽度列的 QML TableView
- intersystems-cache - 使用部分名称在全局中搜索名称
- angularjs - angularjs中的动态登陆页面
- c# - 将 SQL 查询转换为 Linq 查询