#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
Когда я отправляю запрос GET на свои заказы, ответ возвращает мне OjectID в моих OrderItems. Как я могу заполнить модель, чтобы получить имя OrderItems в моем случае? Мои элементы заказа, связанные с моделью продукта. Необходимо вернуть название продукта. Я новичок в mongo db. Не очень хорошо понимаю метод заполнения в Mongo
Результат Postman
[
{
"orderItems": [
"60668d8514508746c5480ede"
],
"status": "3",
"_id": "60668d8514508746c5480edf",
"shippingAddress1": "Lo",
"shippingAddress2": "2/1",
"city": "5",
"zip": "5",
"phone": "5633",
"totalPrice": 700,
"user": {
"_id": "60644f8d87463d10b8c7bb27",
"name": "Lopez",
"id": "60644f8d87463d10b8c7bb27"
},
"dateOrdered": "2021-04-02T03:20:37.884Z",
"__v": 0,
"id": "60668d8514508746c5480edf"
}
]
Мой запрос на получение
router.get(`/`, async (req, res) =>{
const orderList = await Order.find().populate('user', 'name').sort({'dateOrdered': -1});
if(!orderList) {
res.status(500).json({success: false})
}
res.send(orderList);
})
Модели
// Order Model
const orderSchema = mongoose.Schema({
orderItems: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'OrderItem',
required:true
}],
orderSchema.virtual('id').get(function () {
return this._id.toHexString();
});
orderSchema.set('toJSON', {
virtuals: true,
});
exports.Order = mongoose.model('Order', orderSchema);
//Order Items Model
onst orderItemSchema = mongoose.Schema({
quantity: {
type: Number,
required: true
},
product: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Product'
}
})
exports.OrderItem = mongoose.model('OrderItem', orderItemSchema);
Комментарии:
1. Я попробовал ваш код, ничего не изменилось, вернулся идентификатор объекта. Продукт не заполнен
2. Попробуйте
Order.find().populate('user', 'name').populate('orderItems')
.3. Вы заполнили OrderItems?
Ответ №1:
Заказ -> Элементы заказа -> продукт
Вариант -1
Order.find().populate('user', 'name').populate({ path : 'orderItems', populate : { path : 'product' } })
https://github.com/Automattic/mongoose/issues/1377
Вариант -2
https://mongoosejs.com/docs/populate.html
https://mongoosejs.com/docs/populate.html#populate-middleware
Добавьте это:-
const populateProduct = function(next) {
this.populate('product');
next();
};
orderItemSchema.pre('findOne', populateProduct).pre('find', populateProduct);
Измените запрос, как:-
Order.find().populate('user', 'name').populate('orderItems')
Комментарии:
1. Гупта, спасибо, но в представлении списка заказов не работает. мангуст-автопопуляция, думаю, это может быть хорошим решением в моем случае. Спасибо