猫鼬:尝试使用.virtual方法重命名

时间:2019-03-11 18:46:56

标签: mongodb mongoose mongoose-populate

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

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对象,并且没有类别。 我想念什么吗?

1 个答案:

答案 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了解更多信息。