Mongoose使用' path array'填充许多对象。 {path:objectpath,model:' Model'}

时间:2014-10-25 06:16:40

标签: node.js mongodb mongoose populate

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

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

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

我有以下架构。

*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

请让我知道解决方案。谢谢。

2 个答案:

答案 0 :(得分:1)

无法使用mongoose填充嵌套字段,因此您必须嵌套回调。

您可以重新阅读populate的文档以获取用法示例。

这应该有效(未经测试):

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

答案 1 :(得分:1)

Populate可让您获得用户朋友的列表,但如果您还想要用户的朋友朋友,该怎么办?指定populate选项告诉mongoose填充所有用户朋友的friends数组:

User.
findOne({ name: 'Val' }).
populate({
path: 'friends',
// Get friends of friends - populate the 'friends' array for every friend
populate: { path: 'friends' }
});