这是我的产品模型。
const featureHeaderSchema = new Schema({
header: {
type: String,
required: true,
},
});
const featureSchema = new Schema({
title: {
type: String,
required: true,
},
parentHeader: { type: Schema.Types.ObjectId, ref: "product.featureHeaders" }, // not sure if this is correct
parentFeature: { type: Schema.Types.ObjectId, ref: "product.features" }, // not sure if this is correct
});
const productSchema = new Schema(
{
title: {
type: String,
required: true,
},
thumbnail: String,
description: String,
manufacture: { type: Schema.Types.ObjectId, ref: "user" },
featureHeaders: {
type: [featureHeaderSchema],
},
features: {
type: [featureSchema],
},
},
{ timestamps: true }
);
const productModel = mongoose.model("product", productSchema);
字符串
我想通过id找到一个产品,并使用populate获取parentHeader的标题和parentFeature的标题。
我试图通过产品ID获取产品信息,并填充parentHeader和parentFeature,这样我就可以在输出中显示它们的标题。
我试过这个查询:
const output = await productModel
.findById(newProduct._id)
.populate("features.parentFeature")
.exec();
型
但是我得到了这个错误:MissingSchemaError:Schema hasn't been registered for model“product.features”.
1条答案
按热度按时间n1bvdmb61#
首先,
populate
不可能实现你想要做的事情。这是因为schema声明中的ref
属性是用来引用一个模型,而不是一个路径。它用来告诉mongoose你想使用哪个模型来执行$lookup
,mongoose希望那个模型对应于你数据库中的一个集合。其次,您在
productSchema
中为featureHeaders
和features
数组使用子文档,因此无论如何populate
都不适用。幸运的是,你可以修复这个问题,让
populate
为你工作。虽然你的命名约定和用例有点混乱,希望这将有助于解释它是如何做到的:FeatureHeader
和Feature
需要有它们自己的集合,而不是子文档,所以你需要为它们创建模型。字符串
FeatureHeader
和Feature
需要单独保存在各自的集合中,以便引用。型
1.现在,您可以调用
populate
来将ObjectId
替换为相应的文档:型
备注:根据您的设计以及模型的作用域,您可能需要指定
populate
选项对象的path
和/或model
属性,如下所示:型
希望所有这些都是有意义的,如果你有任何问题,请在评论中提出。