多年来,我一直是 sql 数据库用户,我无法弄清楚如何最好地使用 mongoose 在 mongodb 中构造我的数据。作为一个实践项目,我正在整理一个基本的 cms,并且我坚持如何最好地构建我的页面模式,以便允许嵌套到多个级别,同时保持访问父母和孩子的能力,并在任何级别编辑任何页面。
我的结构将是这样的:
page 1 --- sub page 1
| |
| -- sub page 2
|
|
page 2 --- sub page 1 --- sub-sub page 1
| | |
| -- sub page 2 - sub-sub page 2 --- sub-sub-sub page 1
| | |
| -- sub page 3 - sub-sub-sub page 2
| |
| -- sub page 4
|
|
page 3 --- sub page 1
|
- sub page 2
|
- sub page 3
我已经将一个基本的单级模式放在一起作为起点,我可以轻松地查询和更新它:
var pageSchema = new Schema({
name: {
type: String,
required: true
},
url: {
type: String,
required: true
},
order: {
type: Number,
default: 10000
}
});
当弄清楚如何添加子页面时,问题就来了。来自 sql 我的直觉是添加一个 parent_id 字段,但我知道这是一种非常平淡的思考问题的方式,可能不符合 nosql 的精神。
阅读我的第一次尝试是使用填充(http://mongoosejs.com/docs/populate.html。为此,我尝试在我的方案中添加一个额外的字段。
children : [{ type: Schema.Types.ObjectId, ref: 'children' }]
起初这似乎是正确的方法,直到我开始考虑递归种群的问题。首先,仅使用一个模式填充意味着大量重复,而且,为了使我的结构正常工作,我必须能够允许设置和检索嵌套到任意数量级别的内容。这意味着我需要某种递归填充。这听起来真的很痛苦,事实上,当我尝试寻找解决方案时,我遇到了这个问题,这清楚地表明这样做会导致糟糕的表现。
第二个问题是关于使用树文档,但我很难理解这种方法。我尝试搜索与此主题相关的更多问题,但通常答案只是指向预构建的 npm 打包解决方案。这些可能有利于快速启动和运行,但我的项目纯粹是为了学习 nosql 中的结构,所以我不仅在寻找最佳解决方案,而且还要理解它。
有人可以建议如何在我的案例中最好地构建数据,和/或为我指明一些文档的方向,这些文档将使我走上正轨。