【发布时间】: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