Mongoose:尝试使用 .virtual 方法重命名
Mongoose: Trying to use .virtual method to rename
我必须在使用填充时重命名字段的名称。
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');
但不幸的是它不起作用,它 returns 普通 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
returns是一个数组,我们需要把它转成类别对象
阅读 Mongodb $lookup documentation 了解更多信息。
我必须在使用填充时重命名字段的名称。
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');
但不幸的是它不起作用,它 returns 普通 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
returns是一个数组,我们需要把它转成类别对象
阅读 Mongodb $lookup documentation 了解更多信息。