首页 > 解决方案 > Nodejs 猫鼬 | findOneAndUpdate 无法正常工作

问题描述

我正在使用 express.js 和带有 mongoose 模块的 mongodb 来处理节点 js 应用程序来处理数据库。

在一种情况下,我需要languages使用findOneAndUpdate 方法更新用户属性。这个属性是一个对象数组应该看起来像[{"language":"Ar","level":4}]

当我使用以下 nodejs 代码更新它时:

User.findOneAndUpdate({_id:mongoose.Types.ObjectId(req.body.id)}, 
 {$set:{[req.body.key]:req.body[req.body.key]}},(err,doc)=>{

  console.log(req.body) // {id:5d1619fa7c11fa102210ef86,"languages":[{"language":"Ar","level":4}],key:"languages"}
  if (!err) {
    res.json(200,doc);
  }else{
    res.json(500,{error:err});

  }
})

我得到以下结果

在此处输入图像描述

但是当我从 mongo shell 尝试同样的事情时

db.users.findOneAndUpdate({"_id" : ObjectId("5d1619fa7c11fa102210ef86")},{ '$set': {"languages":[{"language":"Ar","level":4}]} })

我得到正确的结果

在此处输入图像描述

这是正确的预期结果。

知道为什么 nodejs 片段无法正常工作。提前致谢。

标签: node.jsmongodbexpressmongoose

解决方案


我认为更新成功运行后您没有得到更新的结果。您需要将new : true更新查询作为第三个参数传入。

默认情况下mongodb返回 之后的旧文档update,但您可以指定在查询中返回更新后的文档。

尝试这个 :

User.findOneAndUpdate({_id:mongoose.Types.ObjectId(req.body.id)}, 
 {$set:{[req.body.key]:req.body[req.body.key]},{new:true},(err,doc)=>{
  ...
  //doc will be updated doc here
})

推荐阅读