首页 > 解决方案 > Mongoose:尝试使用 .virtual 方法重命名

问题描述

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

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,当使用填充时,我希望它是“类别”,所以我曾经virtual创建“类别”。并实现了这个

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

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

标签: mongodbmongoosemongoose-populate

解决方案


为什么不使用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 文档以获取更多信息。


推荐阅读