Mongoose: пытаюсь использовать .virtual метод для переименования

#mongodb #mongoose #mongoose-populate

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

Это моя схема категорий.

И вот моя схема подкатегории

 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 я хочу, чтобы это была «категория», поэтому я использовал virtual для создания «category».
и реализовал это

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

Но, к сожалению, он не работает, он возвращает обычный subCategory объект и в нем нет категории.
Я что-то упускаю?

Ответ №1:

Почему бы вам не использовать 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 object

Прочитайте документацию Mongodb $ lookup для получения дополнительной информации.