2014-01-21 60 views
0

你能告訴我我做錯了什麼嗎?模式聲明和子文檔

var ObjectId = Schema.Types.ObjectId; 
var ProductSchema = new Schema({ 
    name: { type: String, required: true }, 
    price: { type: Number, required: true }, 
    category : { type: String, required: true } 
}); 

var OrderSchema = new Schema({ 
    products: [{ 
     product: {type: ObjectId, ref: 'Product'}, 
     quantity: {type: Number} 
    }], 
    status: { type: String, required: true } 
}); 

Product = mongoose.model('Product', ProductSchema); 
Order = rmongoose.model('Order', OrderSchema); 

OrderSchema.statics.addOrder = function (data, cb) { 
    // data: array of products ID 

    var newOrder = new Order(); 

    data.data.forEach(function(element, index, array) { 

     Product.findOne({ '_id': element.id }, function (err, product) { 
      if (err) return handleError(err); 

      newOrder.products.push({product: product, quantity: element.quantity}); 
     }) 
    }); 

    newOrder.status = 'waiting'; 

    newOrder.save(function (err, order) { 
     if (err) cb(err, false); 
     console.log(order); 
     var response = json.stringify({ 
      event: 'addOrder', 
      success: true, 
      data: order.id 
     }); 

     cb(false, response); 

    }); 
} 

當我添加一個訂單產品,數組總是空的,但我沒有錯誤。也許這是做錯我想要的。

客戶發送的數據很好,foreach和findOne工作正常,但push似乎什麼也沒做。

如果沒有解決方案,也許您可​​以嘗試幫助我找到另一個解決方案。

謝謝:)

回答

0

這是因爲你需要等待所有的產品被發現。

試試這個(未經測試):

OrderSchema.statics.addOrder = function (data, cb) { 
    // data: array of products ID 

    var newOrder = new Order(); 

    var productIds = []; 
    var quantity = []; 

    data.data.forEach(function(element, index, array) { 
     productIds.push(element.id); 
     quantity.push(element.quantity); 
    }); 

    Product.find({ '_id' : { $in: productIds} }, function(err, products) { 
     if (err) return handleError(err); 
     products.forEach(function(product, index) { 
      newOrder.products.push({product: product, quantity: quantity[index]}); 
     }); 

     newOrder.status = 'waiting'; 
     newOrder.save(function (err, order) { 
      if (err) cb(err, false); 
      console.log(order); 
      var response = json.stringify({ 
       event: 'addOrder', 
       success: true, 
       data: order.id 
      }); 

      cb(false, response); 
     }); 
    }); 
}); 
+0

我今天早上試着和它工作得很好。非常感謝你。 – vlncent