2016-09-19 171 views
0

我有一个orderSchema具有subdoc productOrder猫鼬填充subdoc的

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; 

我希望得到orderproductOrderorderSchema):

尝试这些

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.idorderIdconsoleobject看起来像这样:(抱歉,WebStorm没有复制/从控制台粘贴)

console.log(JSON.stringify(products)

另一种方法我试过

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) 感谢名单

+0

你为什么不使用引用命令,并将其作为subdoc的像你一样的用户做到这一点:用户名:{类型:mongoose.Schema.Types.ObjectId,ref:'User'}? –

+0

@IgnatGalkin,我知道这可以做到这一点...尝试了解哪个更好......找不到任何东西......想法? – Jadeye

回答

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 
     }); 
     } 
    }); 
+2

您也可以跳过'populate()':子文档包含在父文档中,它们不单独存储。 – robertklep

+0

@robertklep,有趣的是'res.render'改变'view',但是'URL'保持不变,因此,如果I'F5'当前屏幕,它可以回到'carts' ...任何想法为什么?我用这个代码10次没有任何问题... – Jadeye