【问题标题】:findbyIdAndUpdate not working when there is addition of records in collection当集合中添加记录时,findbyIdAndUpdate 不起作用
【发布时间】:2019-12-02 04:53:10
【问题描述】:

我编写了一个更新查询,它将通过_id 查找记录并更新。在我在该集合中添加新记录之前,此代码完全可以正常工作。如果添加一条记录并进行查询,它将进入成功部分,但返回 null 而不是数据。但是当我重新启动代码并尝试相同的操作时,它工作正常。我的方法是 PUT。

accept = (req, res) => {
var query = { _id: req.params.uid };
var updatevalue = { $set: { status: 3 } };
var options = { new: true }
this._model.findByIdAndUpdate(query, updatevalue, options, (err, obj) => {
    if (err) {
        res.send(err);
    }
    else {
       res.send(obj);

    }
});

}

请求

api.abc.com/api/accept/5cfe4dd898fd225ef1cabdsd

【问题讨论】:

  • 您不必将 uid 转换为 ObjectId,因为 Mongoose 会在后台隐式转换它,只需在查询中执行 user: req.params.uid
  • user 是 objectid 无所谓?
  • 什么是“重启代码”?重新启动服务器还是更改代码中的某些内容然后重新设置?

标签: node.js mongodb amazon-web-services mongoose


【解决方案1】:

虽然你是don't have to pass id in the form of an object,但罪魁祸首似乎在req.params.uid。 仔细检查uid 是否真的设置在req.params 上,并且在某种意义上它指向您集合中的文档是正确的。 就目前而言,这是解释为什么您会得到null 的唯一明显原因。 您可以使用 db.collection.find(<query>) 通过 mongo shell 检查。

【讨论】:

    【解决方案2】:

    您对findByIdAndUpdate 的使用似乎不正确,第一个参数应该是一个id(mongodb 对象ID 或只是一个字符串)而不是一个对象。我会先试试这个

    this._model.findByIdAndUpdate(req.params.uid, updatevalue, options, (err, obj) => {
        if (err) {
            res.send(err);
        }
        else {
           res.send(obj);
    
        }
    });
    

    或者,如果您想在代码中使用query 作为过滤器,那么您可以改用findOneAndUpdate。详细文档是here

    【讨论】:

      【解决方案3】:

      通常,我们可以通过多种方式更新一条记录

      1. findOneAndUpdate() 方法用于更新集合中的记录。 可以使用这种方法,而不是手动查找记录然后更新它。 这种方法比手动方法工作得更快。 它有一个选项标志new,如果为真,它将在响应中返回一条更新的记录。
          User.findOneAndUpdate({_id: id},{$set:{name:user.name}},{new:true}).then((docs)=>{
              if(docs) {
                 resolve({success:true,data:docs});
              } else {
                 reject({success:false,data:"no such user exist"});
              }
          }).catch((err)=>{
             reject(err);
          });
      
      1. findByIdAndUpdate() 方法用于根据 Id 更新记录。 我们可以将 id 作为«Object|Number|String» _id 的值传递给查询。所以在这里,我们可以直接通过req.params.id
          User.findByIdAndUpdate(req.params.id,{$set:{name:user.name}},{new:true}).then((docs)=>{
             if(docs) {
               resolve({success:true,data:docs});
             } else {
               reject({success:false,data:"no such user exist"});
             }
          }).catch((err)=>{
              reject(err);
          })
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-03
        • 2021-05-26
        • 2012-08-03
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多