【问题标题】:how to populate() a mongoose .findOneAndUpdate object如何填充()猫鼬 .findOneAndUpdate 对象
【发布时间】:2014-07-24 07:30:02
【问题描述】:

下面的代码有效,它会更新一条记录,如果它还不存在则创建一条记录。但是,我想将此findOneAndUpdate() 语句与populate() 方法结合起来,以填充我的对象的“用户”。将populate("user") 语句添加到此逻辑的正确方法是什么?

我尝试在findOneAndUpdate 完成后添加populate() 方法,但返回的错误提示此方法不存在。我正在运行最新版本的猫鼬。

LoyaltyCard.findOneAndUpdate({ business: businessid}, { $set: newCard, $inc: { stamps: +1 } }, { upsert: true}, function(err, card){

    if(err)
    {

    }
    else
    {

    }

    res.json(result);
});

【问题讨论】:

    标签: javascript mongoose


    【解决方案1】:

    使用exec()代替回调参数:

    LoyaltyCard.findOneAndUpdate(
            {business: businessid},
            {$set: newCard, $inc: {stamps: +1}},
            {upsert: true}
        )
        .populate('user')
        .exec(function(err, card) {
            if (err) {
                // ...
            } else {
                res.json(result);
            }
    });
    

    【讨论】:

      【解决方案2】:

      async/await 我删除了 exec

      const getLoyaltyCard = async () => {
          const results = await LoyaltyCard.findOneAndUpdate(
              { business: businessid },
              { $set: newCard, $inc: { stamps: + 1 } },
              { upsert: true }
          )
          .populate('user')
          return results
      }
      

      【讨论】:

      • exec() 实际上将它变成了与 async/await 一起使用的完整承诺
      【解决方案3】:

      您还可以在.findOneAndUpdate() 的第三个参数中添加populate 对象作为选项之一,如下所示:

      LoyaltyCard.findOneAndUpdate(
              { business: businessid },
              { $set: newCard, $inc: { stamps: +1 } },
              { upsert: true, populate: { path: 'user' } }
          )
          .exec(function(err, card) {
              if (err) {
                  // ...
              } else {
                  res.json(result);
              }
      });
      

      【讨论】:

        【解决方案4】:

        只是加强@rahulchouhan 的回答:

        您可以将填充添加为选项之一,这是 findOneAndUpdate 函数的第三个参数,它的工作原理与任何其他承诺(然后,捕获)一样

        LoyaltyCard.findOneAndUpdate(
                { business: businessid },
                { $set: newCard, $inc: { stamps: +1 } },
                { upsert: true, populate: { path: 'user' } }
            )
            .then(card => {
               res.status(200).json(card);
            }).catch(err => {
               res.status(500).json({ message: err.message});
            });
                
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-28
          • 2014-11-25
          • 2023-03-16
          • 1970-01-01
          • 2015-05-29
          • 1970-01-01
          • 2013-01-13
          相关资源
          最近更新 更多