使用填充时,我必须重命名字段名称。
const CategorySchema = new Schema(
{
name: {
type: String,
unique: true
},
featured: {
type: Boolean,
default: true
},
image: String,
active: {
type: Boolean,
default: true
},
subCategoryIds: [{ type: Schema.Types.ObjectId, ref: 'SubCategory' }]
},
{
timestamps: true
}
);
export default mongoose.model('Category', CategorySchema);
这是我的类别架构。
这是我的SubCategory模式
const SubCategory = new Schema(
{
name: {
type: String,
unique: true
},
active: {
type: Boolean,
default: true
},
categoryId: { type: Schema.Types.ObjectId, ref: 'Category' },
productIds: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
},
{
timestamps: true
}
);
SubCategory.virtual('category', {
ref: 'Category',
localField: 'categoryId',
foreignField: '_id'
});
export default mongoose.model('SubCategory', SubCategory);
这里有一个categoryId
字段,使用填充时,我希望它是'category',所以我用virtual
创建了'category`。
并实现了
const subCategories = await SubCategory.find({}).populate('category');
但是不幸的是,它无法正常工作,它返回普通的subCategory
对象,并且没有类别。
我想念什么吗?
答案 0 :(得分:2)
为什么不使用Mongodb
聚合管道而不是使用mongoose virtuals
,而是可以使用$lookup
并在填充时将catergoryId
更改为类别。
尝试一下:
const subCategories = await SubCategory.aggregate([{
$lookup : {
from : "categories",
localField : "categoryId",
foreginField : "_id",
as : "category"
},{
$unwind : "$category"
}])
localField
说出要填充的字段,from
告诉monogdb从哪个集合填充,foreignField
告诉mongodb哪个字段与人口匹配,并使用as
对于将要存储结果的字段,
$unwind
用于下一阶段,因为$lookup
返回一个数组,我们需要将其转换为类别对象
阅读Mongodb $lookup documentation了解更多信息。