【问题标题】:Populate Dynamic Fields Mongoose填充动态字段 Mongoose
【发布时间】:2021-09-06 16:14:24
【问题描述】:

我正在尝试创建一个动态函数,该函数获取字段数组、过滤器对象和模式模型,并填充数组中的字段。

例如: 而不是像这样填充-

getCardByName=(Model,filter)=>{ 
         return new Promise((resolve, reject) => {
             Model.findOne(filter).populate({ path: "user" })
                 .populate({ path: "socialMedia" })
                 .populate({ path: 'galleryList' })
                 .populate({ path: 'reviewsList' })
                 .populate({ path: 'lead' })
                 .populate({ path: 'statistic', })
                 .exec(async(err, card) => {
                     if (err) {
                         reject(err);
                     }
                     resolve(card)
                 })
       });
}

我想创建一个类似这样的动态函数:

 //assume arr is a function argument
    arr=["user", "socialMedia", "galleryList", "reviewsList", "lead", "statistic"]
    let populateStr=""
        arr.forEach(path => {
            populateStr+=`.populate({path: ${path}})`
        });
        console.log(populateStr)
        return new Promise(async(resolve, reject)=>{
            try{
              await Model.findOne(filter).populateStr
              .exec(async(err,card)=>{
                  if(err)
                  {
                      reject(err)
                      resolve(card)
                  }
              })

              }
        catch(err){
    console.log(err)
    }
    })

当我运行这段代码时,我得到了人口字符串,但人口本身并没有真正发生。

(TypeError: 无法读取未定义的属性 'exec')

你有什么想法或者修改我写的代码吗?

谢谢!

【问题讨论】:

    标签: node.js express mongoose dynamic-programming mongoose-populate


    【解决方案1】:

    你可以这样做

    var query = Model.findOne(filter);
    
    arr.forEach(path => {
        query.populate(path);
    });
    
    query.exec(async (err, card) => {
        if (err)
            reject(err)
        else 
            resolve(card)
    });
    

    当您在 exec 回调函数中使用 resolve/reject 时,没有理由为 Model.findOne 使用 await。也不需要 try/catch。

    【讨论】:

    • 成功了,谢谢。现在,如果我想添加一个过滤器?例如 - 匹配?
    • 除非我弄错了,否则 $match 仅在 aggregate 函数中可用。所以你需要更具体。
    • 类似这样的东西: Model.findOne(filter) .populate({ path: "cards", populate: [ { path: 'user' }, { path: 'socialMedia' }, { path: 'galleryList' }, { path: 'reviewsList' }, { path: 'lead' }, { path: 'statistic' } ], match: { isDelete: false } })
    猜你喜欢
    • 2012-01-22
    • 2017-05-21
    • 2021-02-24
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2019-01-01
    相关资源
    最近更新 更多