【问题标题】:Mongoose populate many objects using 'path array' {path: objectpath,model:'Model'}Mongoose 使用 'path array' {path: objectpath,model:'Model'} 填充许多对象
【发布时间】:2018-01-08 19:28:49
【问题描述】:

在我的 web 应用程序中,在订购 (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

请告诉我解决方案。谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose populate


    【解决方案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);
            });
        });
    });
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 2020-03-11
        • 2014-12-23
        • 2016-09-14
        • 2017-02-10
        • 2012-05-20
        • 2021-12-07
        相关资源
        最近更新 更多