Как заполнить модель в mongoose

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

https://www.npmjs.com/package/mongoose-autopopulate

Комментарии:

1. Гупта, спасибо, но в представлении списка заказов не работает. мангуст-автопопуляция, думаю, это может быть хорошим решением в моем случае. Спасибо