MongoDB: 如何引用变量路径?

MongoDB: How to make a reference to a variable path?

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

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"
    }
  }]
});

我不确定我之前在评论中指出的问题。我认为如果 'Path to various models' 表示 'references to other models',您正在寻找 populate。根据 here,你可以做类似

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

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

如果您的元素来自具有基本类型和多个派生类型的单个集合,您也可以选择 Mongoose discriminator method here. You can find more in 。在这种技术中,您需要

  1. 为所有 contentItem 路径创建基本架构
  2. 使用鉴别器进行鉴别

我仍然不建议这样做,因为它会导致糟糕的设计。

并且根据 here,最好将引用与定义的类型放在一起。

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

希望对您有所帮助