Mongoose: попытка использовать метод .virtual для переименования - PullRequest
2 голосов
/ 11 марта 2019

Я должен переименовать имя поля при использовании заполнить.

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, и категория отсутствует. Я что-то упустил?

1 Ответ

2 голосов
/ 16 марта 2019

Почему вы не используете 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 $ справочную документацию для получения дополнительной информации.

...