如何使用mongoose构建mongodb中的多级嵌套

时间:2014-12-27 20:51:37

标签: node.js mongodb mongoose mongoose-populate nosql

作为和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' }] 

这开始似乎是正确的方法,直到我开始考虑递归人口问题。首先,使用只有一个模式的populate意味着需要大量重复,而且,为了使我的结构能够工作,我必须能够设置和检索嵌套到任意数量级别的内容。这意味着我需要某种递归填充。这听起来非常痛苦,当我尝试寻找解决方案时,我遇到了这个问题,这清楚地表明这样做会导致糟糕的表现。

mongoose recursive populate

第二个问题涉及使用树文档,但我很难理解这种方法。我尝试搜索与此主题相关的更多问题,但通常答案仅指向预构建的npm打包解决方案。这些可能对于快速启动和运行很有帮助,但我的项目纯粹是为了学习nosql中的结构,所以我不只是寻找最佳解决方案,而是要了解它。

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

0 个答案:

没有答案