3

多年来,我一直是 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 中的结构,所以我不仅在寻找最佳解决方案,而且还要理解它。

有人可以建议如何在我的案例中最好地构建数据,和/或为我指明一些文档的方向,这些文档将使我走上正轨。

4

0 回答 0