2016-09-19 8 views
0

Ich habe eine orderSchema das hat eine subdoc productOrder:Mongoose bevölkern 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 Schema

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; 

Ich wünsche productOrder von order (orderSchema) zu erhalten:

versucht diese

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

Wo req.body.id die orderId ist und die object in console sieht wie folgt aus: (sorry, WebStorm kein Kopieren/Einfügen von Konsole)

console.log(JSON.stringify(products)

Ein anderer Weg, ich

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

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

Und noch ein

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

Sie alle am Ende mir den gesamten doc der Bestellung zu geben. Wie bekomme ich nur die Produkte der Bestellung? (productOrder) Thanx

+0

, warum Sie nicht Referenz verwenden, um zu bestellen und als SubDoc zu halten, wie Sie es mit Benutzer tun: userId: {type : mongoose.Schema.Types.ObjectId, ref: 'Benutzer'}? –

+0

@IgnatGalkin, ich weiß, dass es auch so gemacht werden kann ... versucht zu verstehen, was besser ist ... konnte nichts finden ... Ideen ?? – Jadeye

Antwort

1

Sie select Funktion verwenden können und dann bevölkern, wie folgend

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

Sie können auch 'populate()' überspringen: Filialdokumente sind im übergeordneten Dokument enthalten, sie werden nicht separat gespeichert. – robertklep

+0

@robertklep, witzig genug der 'res.render' ändert' view' aber 'URL' bleibt gleich, also wenn ich' F5' den aktuellen Bildschirm, geht es zurück zu 'carts' ... keine Ahnung warum ?? Ich habe diesen Code zehnmal ohne Probleme benutzt ... – Jadeye

Verwandte Themen