我正在使用express.js和mongodb以及mongoose模块处理节点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片段无法正常工作。 预先感谢。
答案 0 :(得分:0)
我认为您无法在成功运行更新后取回更新的结果。您需要在更新查询中传递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
})