Mongoose使用'path数组'来填充许多对象{path:objectpath,model:'Model'}

在我的networking应用程序中,订购(SingleOrder)产品后,客户应该检查优惠。 如果可用,那么我应该添加订单到ComboOfferOrder。

在那里,我想检查订单的付款状态。 另外,我必须得到整个产品清单。

我在我的数据库中的所有值在后端。 但是我无法为我的api方法填充“SingleOrder”中的任何对象。

我有下面的模式。

*User* { name : String, email : Sring, role : String } *BankTransaction* { type : String, transationReference: String, date : Date, amount : Number } *ComboOfferOrder* { customer :{ type :Schema.ObjectId, ref : 'User' }, order : { type :Schema.ObjectId, ref : 'SingleOrder' }, productList : [{ type :Schema.ObjectId, ref : 'Product' }] discount : Number, totalCost : Number, paymentStatus :String, deliveryStatus : String } *SingleOrder* { code: String, products : { groceries:[{ type :Schema.ObjectId, ref : 'Product' }], other:[{ type :Schema.ObjectId, ref : 'Product' }] }, billingAddress: String, deliveryAddress : String, payment:{ status : String, transaction :{ type :Schema.ObjectId, ref : 'BankTransaction' } } } *Products* { name : String, cost : Number, expiryDate : Date } 

我的api

 mongoose.model('ComboOfferOrder') .findOne({ _id: comboOfferOrderId }) .select('order') .exec(function(err, comboOfferOrder) { var paths = [ {path : "payment.status"}, {path : "payment.trasaction"}, {path : "products.groceries"}, {path : "products.other"} ]; mongoose.model('comboOfferOrder').populate(comboOfferOrder.order,paths,function(err, singleOrder) { if (err) { return deferred.reject(err); } return deferred.resolve(comboOfferOrder.order); }); }); 

结果,我只获得了“payment.status”,“payment.trasaction”,products.groceries,“products.other”的objectIds,

请让我知道解决办法。谢谢。

不能用mongoose填充嵌套字段,因此你必须嵌套你的callback。

您可能会重新阅读使用示例的填充文档。

这应该工作(未testing):

 mongoose.model('ComboOfferOrder') .findOne({ _id: comboOfferOrderId }) .select('order') .exec(function(err, comboOfferOrder) { comboOfferOrder.populate('order', function(err, singleOrder) { singleOrder.populate('products.other products.groceries etc...', function(err, singleOrder) { if (err) { return deferred.reject(err); } return deferred.resolve(singleOrder); }); }); });