【问题标题】:findOneAndUpdate isn't updatingfindOneAndUpdate 没有更新
【发布时间】:2022-01-09 01:16:49
【问题描述】:

我有一个产品,我需要更新产品的数量。使用 findOneAndUpdate 时请求成功,但数据库中的数据没有改变。

代码:

exports.updateQuantity = (req, res) => {
  Item.findOneAndUpdate(
    { _id: req.body.id }, //condition
    { quantity: 2 }, //update
    { new: true },
    function (err, product) {
      if (err) {
        res.status(400).json(error);
      } else {
        res.status(201).json("product updated");
      }
    }
  );
};

路线:

router.post("/updateQuantity", updateQuantity);

我也试过给{$set :{ quantity: 2 }},但似乎没有更新。 还尝试切换到放置而不是发布。但没有希望。

【问题讨论】:

  • 必须没有匹配的产品
  • 尝试用 async 包装你的函数,并在查询 await Item.findOneAndUpdate( 之前放置 await
  • @AlexBlex id 确实存在。我确实在创建产品后复制了 id 并在数据库中进行了交叉检查。
  • 数据库中的_id和req.body.id中的_id是同一类型吗?前者默认是 ObjectId,后者是字符串,除非你对请求参数进行猴子补丁。
  • @AlexBlex 是的,问题是我的我的 obj 有另一个数组,其中有相同的类型 _id(差异值)

标签: node.js mongodb express mongoose


【解决方案1】:

您可以在更新之前先检查提供的Id是否存在

exports.updateQuantity = async (req, res) => {
   try{
      let item = await Item.findById(req.body.id)
      if(!item) return res.status(404).json("No product found with the given Id")
      await Item.findByIdAndUpdate(
        req.body.id,
        { quantity: 2 },
        { new: true },
      );
    }
    catch(ex){
      return res.status(400).send(ex.message)
    }
  
};

【讨论】:

  • id 确实存在。我确实在创建产品后复制了 id 并在数据库中进行了交叉检查。
  • 而且错误还在?
  • 亲爱的@NkubitoPacis,欢迎来到 Stackoverflow。我们非常感谢您为贡献和帮助其他编码人员所做的努力。建议在发布之前检查您的代码。这是一个专业的社区,错误和误导性的答案被否决并不少见。 Item.findById(req.body.id) 返回一个 Query 对象的实例,而不是您的代码 sn-p 所暗示的数据库中的项目。请阅读文档:mongoosejs.com/docs/api.html#model_Model.findById
  • 谢谢。我已经更新了代码
  • =) 朝着正确的方向迈出了一大步。仍然行不通,但你已经接近了。让我再说一遍:Item.findById(req.body.id) 返回一个 Query 对象的实例,而不是 Promise。 await 单独无济于事。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2019-05-21
  • 2021-11-20
  • 1970-01-01
  • 2017-12-21
  • 2020-11-13
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多