gpt4 book ai didi

mongodb - Mongoose:尝试使用 .virtual 方法重命名

转载 作者:可可西里 更新时间:2023-11-01 10:08:39 27 4
gpt4 key购买 nike

我必须在使用填充时重命名字段的名称。

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);

这是我的类别架构。

这是我的子类别架构

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,当使用 populate 时,我希望它是“category”,所以我使用 virtual 来创建“category”。并实现了这个

const subCategories = await SubCategory.find({}).populate('category');

但不幸的是它不工作,它返回正常的 subCategory 对象并且不存在类别。我错过了什么吗?

最佳答案

为什么不使用 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返回的是一个数组,我们需要将其转换为category对象

阅读Mongodb $lookup documentation了解更多信息。

关于mongodb - Mongoose:尝试使用 .virtual 方法重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55108437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com