Это моя модель product.js
const mongoose = require("mongoose");
const { Schema } = mongoose;
const productsSchema = new mongoose.Schema({
name: {
type: String,
required: [true, "Name is required"]
},
imgURL: {
type: String,
required: [true, "imgURL is required"]
},
description: {
type: String,
required: [true, "Description is required"]
},
categoryName: {
type: String,
required: [true, "Category is required"]
},
price:{
type: Number,
required: [true, "Price is required"],
default: false
},
isActive:{
type: Boolean,
default: true
},
variations: {
size:[
{
type: Schema.Types.ObjectId,
ref: 'Size'
}
]
}
})
const Products = mongoose.model('Products', productsSchema);
module.exports = Products;
и вот мой код:
const Products = require("../models/products");
const Size = require("../models/size")
module.exports.createProduct = (req,res) => {
if (!req.user.isAdmin) {
return Promise.reject("Only administrators can create products")
}
const newProduct = new Products ({
name: req.body.name,
imgURL: req.body.imgURL,
description: req.body.description,
categoryName: req.body.categoryName,
isActive: req.body.isActive,
price: req.body.price
});
return newProduct.save()
.then(() => {
return res.send(true);
})
.catch((error) => {
console.error(error);
if (error.name === 'ValidationError') {
return res.status(400).json({message: 'Validation Error', errors: error.errors});
}
return res.status(500).json({message: 'Internet server error'});
});
};
module.exports.getAllActiveProducts = (req, res) => {
Products.find({ isActive: true })
.populate({ path: 'variations.size', model: 'Size'})
.then(result => {
console.info("Found products with variations:", result);
return res.send(result);
})
.catch(err => {
console.error("Error fetching active products:", err);
return res.status(500).json({ error: "Failed to fetch active products" });
});
};
Это моя модель размера
const mongoose = require("mongoose");
const sizeSchema = new mongoose.Schema({
name: {
type: String,
required: [true, "Size is required"]
},
isActive: {
type: Boolean,
default: true
}
})
const Size = mongoose.model('Size', sizeSchema);
module.exports = Size;
Я хочу заполнить поле размера, но, похоже, у меня возникла проблема с подключением моей модели (Размер), поскольку она возвращает пустой массив.
Посмотреть скриншот моего Почтальона
Я уже использовал ref и populate для заполнения поля размера, но это не работает.
Коллекция размеров: Скриншот
Метод populate Mongoose не поддерживает вложенные массивы напрямую.
Я уже добавил модель размера.
Я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать ваш отзыв.





Добавьте это в свою модель Product, удалив существующую variations.
variations: [
{
type: Schema.Types.ObjectId,
ref: 'Size'
}
]
Затем создайте Product вот так. Попробуйте использовать async((req,res) =>{.., поскольку мой код соответствует этому подходу.
const Products = require('./path_to_product_model');
const Size = require('./path_to_size_model');
//create "Size" Documents
const smallSize = new Size({ name: 'Small' });
const mediumSize = new Size({ name: 'Medium' });
await smallSize.save();
await mediumSize.save();
//create "Product" Document
const newProduct = new Products ({
name: req.body.name,
imgURL: req.body.imgURL,
description: req.body.description,
categoryName: req.body.categoryName,
isActive: req.body.isActive,
price: req.body.price ,
variations: [smallSize._id, mediumSize._id]
});
await newProduct.save();
Чтобы получить Product и заполнить его поле variations соответствующим Size documents, сделайте следующее:
const product = await Products.find({ isActive: true}).populate('variations');
Попробуйте это. Это сработает.
Для получения дополнительной информации о populate() вы можете перейти по ссылке на документ, приведенной ниже.
https://mongoosejs.com/docs/populate.html#saving-refs
N:B: - В приведенном выше блоке кода я использовал async-await для получения данных на основе Promise. Если вы хотите, вы можете измениться соответствующим образом.
Нужно ли мне добавлять размеры при создании продукта, даже если у меня уже есть коллекция размеров? Я приложил скриншот коллекции размеров.
@das, Нет, вам не обязательно добавлять варианты Size при создании Product. Поле variations в Product schema представляет собой массив, и если вы не укажете никаких значений, по умолчанию это будет просто пустой массив. Работает ли приведенный выше код?
Все равно не заполняется :(
@das Хорошо, какую ошибку вы получаете? Вы внесли все соответствующие изменения?
@das, есть ли данные (действительные идентификаторы ObjectId) в variations модели продукта, которые ссылаются на существующие документы размера? Если в variations модели продукта нет действительных ObjectIds, они не будут заполняться и будут возвращать нулевое значение, которое вы уже получаете
@das вы также можете найти продукт по идентификатору и обновить его поле «варианты». Вы можете сделать это следующим образом const product = await Product.findByIdAndUpdate( productId, { $push: { variations: largeSize._id } }, { new: true } ).populate('variations');
@das, я знаю, что застревать на этом целый день раздражает, но если у вас возникли проблемы с пониманием моего ответа, вы можете проверить эту ссылку, чтобы получить больше информации о том, как это работает. dev.to/paras594/how-to-use-populate-in-mongoose-node-js-mo0
Теперь это работает. Спасибо за помощь @Subha :)
@das , пожалуйста.Рада Вам помочь
@das, пожалуйста, добавьте тег node к своему вопросу.
Поделитесь, пожалуйста, схемой для
Sizeмодели.