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在下一阶段用到,因为$lookupreturns是一个数组,我们需要把它转成类别对象

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