【问题标题】:Nodejs Mongoose | findOneAndUpdate not working properly [duplicate]Nodejs 猫鼬 | findOneAndUpdate 无法正常工作 [重复]
【发布时间】:2019-11-10 22:57:20
【问题描述】:

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

在一种情况下,我需要使用 findOneAndUpdate 方法更新用户属性 languages。这个属性是一个对象数组,应该看起来像[{"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 sn-p 不能正常工作。 提前致谢。

【问题讨论】:

  • 确保架构正确
  • 感谢您的回复,架构正确。
  • 我同意,除非您的身体看起来像 body = { key: "value", "value": "value2"},否则您的 $set 将始终导致未定义,因为您使用的语法会导致猫鼬模式“保护”启动并取消您的歌声。
  • @tom 我已经在上面的代码 sn-p 中记录了正文
  • mb 没注意到,好吧 mongoosey 语法是正确的,并且假设架构也是正确的(除非您想对其进行编辑以仔细检查),唯一可能导致的问题是问题不是 sanitizng身体意义级别等于“4”而不是4。但从sn-p来看,情况似乎并非如此。在满足所有这些条件的情况下,此代码在我的本地可以正常工作。

标签: node.js mongodb express mongoose


【解决方案1】:

我认为更新成功运行后您没有得到更新的结果。您需要在更新查询中传递 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
})

【讨论】:

  • 感谢您的回答,我的问题与返回的对象无关我知道它默认是旧的,我的问题是保存在我的数据库中的实际数据。
  • 你能展示你的猫鼬模式吗,你的模式中有“位置”吗?
猜你喜欢
  • 2013-02-13
  • 2015-09-15
  • 2018-06-18
  • 2019-07-07
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
相关资源
最近更新 更多