MongoDB:如何引用变量路径?

时间:2016-09-03 14:06:56

标签: mongodb database-design mongoose mongoose-schema non-relational-database

我有一个名为PageSection的模式。 PageSection嵌入了Schema ContentItem的数组。内容项应引用其他集合的文档,这些文档可以是可变的 - 如文本,图片,链接,复选框,......

var PageSection = new mongoose.Schema({
  title: String,
  order: Number,
  contentItems: [{
    order: Number,
    element: {
      type: mongoose.Schema.Types.ObjectId,
      path: "Path_to_various_models"
    }
  }]
});

这可能吗?或者有更好的方法来进行这种变量引用吗?

谢谢!

修改 感谢您使用鉴别器Swagata的建议。我不知道继承机制。但无论如何,我发现解决方案有点复杂。

我现在使用一个解决方案,其中ContentItem包含每种类型内容项的字段。也许它更像是一种解决方法而不是解决方案。

var PageSection = new mongoose.Schema({
  title: String,
  order: Number,
  contentItems: [{
    order: Number,
    text: {
      type: mongoose.Schema.Types.ObjectId,
      path: "Text"
    },
    picture: {
      type: mongoose.Schema.Types.ObjectId,
      path: "Picture"
    },
    link: {
      type: mongoose.Schema.Types.ObjectId,
      path: "Link"
    }
  }]
});

1 个答案:

答案 0 :(得分:1)

我不确定这个问题,因为我在之前的评论中指出了这个问题。如果“各种模型的路径”意味着“对其他模型的引用”,我认为你正在寻找填充。根据{{​​3}},您可以执行类似

的操作
var PageSection = new mongoose.Schema({
  title: String,
  order: Number,
  contentItems: [{
    order: Number,
    element: mongoose.Schema.Types.ObjectId,
    path: { type: Schema.Types.ObjectId, ref: 'Story' }
  }]
});

现在,我明白这只适用于一种类型的参考,路径不能只是故事。

如果您的元素来自具有基本类型和多个派生类型的单个集合,则可以在此处使用here方法。您也可以在Mongoose discriminator中找到更多信息。在这种技术中,你需要

  1. 为所有contentItem路径创建基本架构
  2. 使用鉴别器来区分
  3. 我仍然不建议这样做,因为它会导致糟糕的设计。

    根据here,最好将引用与定义的类型保持一致。

    您仍然可以在contentItems数组中使用自己的方式管理引用,其中包含id和collection / ref字段,我认为在这种情况下会更好。

    希望有所帮助