Мангуст заполняет поддок

У меня есть orderSchema, у которого есть subdoc productOrder:

const paymentTrans = require('./PaymentTrans').schema;
const productOrder = require('./ProductOrder').schema;

const orderSchema = new mongoose.Schema({
    orderId: { type: mongoose.Schema.Types.ObjectId },
    userId : {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    productOrder: [productOrder],
    totalPerOrder: {type: Number, default:''},
    paymentTrans: [paymentTrans]
}, { timestamps: true });

const Order = mongoose.model('Order', orderSchema);

module.exports = Order;

Схема porductOrder

const productOrderSchema = new mongoose.Schema({
    sku: { type: String, default: '' },
    name: { type: String, default: '' },
    quantity: { type: Number, default: '' },
    price: { type: Number, default: '' },
    total: { type: Number, default: '' }
});

const ProductOrder = mongoose.model('ProductOrder', productOrderSchema);

module.exports = ProductOrder;

Я хочу получить productOrder от order (orderSchema):

попробовал это

Order.findById(req.body.id)
        .exec(function (err, products) {
            var opts = {
                path: 'productOrder',
                model: 'ProductOrder'
            };

            Order.populate(products, opts, function (ree, products) {
                console.log(JSON.stringify(products));
            });

            res.render('store/cart', {
                title: 'MyCart',
                angularApp: 'storeApp',
                products: products
            });
        });

Где req.body.id — это orderId, а object в console выглядит так: (извините, WebStorm нельзя скопировать/вставить из консоли)

console.log(JSON.stringify(продукты)

Еще один способ, который я пробовал

Order.findById(req.body.id, function (err, products) {
        var opts = [
            { path: 'productOrder',  model: 'ProductOrder' }
        ]

        Order.populate(products, opts, function (err, products) {
            console.log(products);
        })
    })

И еще один

Order.find({ _id: req.body.id, userId: req.user._id })
        .populate({
            path: 'productOrder',
            populate: {
                path: 'productOrder',
                model: 'ProductOrder'
            }

        })
        .exec(function (err, productOrder) {
            //products.forEach(function(elem){
                console.log("products = " + JSON.stringify(productOrder));
            //});

            console.log("REQ._ID " + req.body.id);
            res.render('store/cart', {
                title: 'MyCart',
                angularApp: 'storeApp',
                products: productOrder
            });
        });

В конце концов они все отдали мне все doc заказа. Как я могу получить только продукты заказа? (productOrder) Спасибо


person Jadeye    schedule 19.09.2016    source источник
comment
почему бы вам не использовать ссылку для заказа и не сохранить ее как поддокумент, как вы это делаете с пользователем: userId: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}?   -  person Ignat Galkin    schedule 19.09.2016
comment
@IgnatGalkin, я знаю, что это можно сделать и так... пытался понять, что лучше... ничего не нашел... Идеи??   -  person Jadeye    schedule 19.09.2016


Ответы (1)


Вы можете использовать функцию select, а затем заполнить следующим образом

Order.findOne({ _id: req.body.id})
    .select('-_id productOrder')
    .populate('productOrder')
    .exec(function (err, orderObj) {
      if(!err) {
        var productOrder = orderObj.productOrder;
        //products.forEach(function(elem){
            console.log("products = " + JSON.stringify(productOrder));
        //});

        console.log("REQ._ID " + req.body.id);
        res.render('store/cart', {
            title: 'MyCart',
            angularApp: 'storeApp',
            products: productOrder
        });
      }
    });
person Arif Khan    schedule 19.09.2016
comment
Вы также можете пропустить populate(): вложенные документы включены в родительский документ, они не хранятся отдельно. - person robertklep; 19.09.2016
comment
@robertklep, как ни странно, res.render меняется на view, но URL остается прежним, поэтому, если я нажму F5 на текущем экране, он вернется к carts... есть идеи, почему?? Я использовал этот код 10 раз без каких-либо проблем... - person Jadeye; 21.09.2016