#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 для получения дополнительной информации.