我有一个名为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"
}
}]
});
答案 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中找到更多信息。在这种技术中,你需要
我仍然不建议这样做,因为它会导致糟糕的设计。
根据here,最好将引用与定义的类型保持一致。
您仍然可以在contentItems
数组中使用自己的方式管理引用,其中包含id和collection / ref字段,我认为在这种情况下会更好。
希望有所帮助