NodeJS和Mongoose,无法更新对象数组中的值

时间:2018-09-04 14:25:51

标签: node.js mongodb mongoose

我正在用猫鼬函数UserSchema更新findByIdAndUpdate()中某些特定的数组。

这是我的UserSchema

const UserSchema = new mongoose.Schema({
    mail: {type: String, required: true, unique: true},
    password: {type: String, required: true},
    friends: [{id: String}],
    prot: [{
        id: String,
        admin: Boolean,
    }]
});

我只想更新prot元素,这就是我要这样做的方式:

User.findByIdAndUpdate(req.body.userId, {
        $set: { prot: [{ id: req.body.lockId, admin: req.body.isAdmin }] }, function(err, user) {
            if (err) {
                return res.status(500).send({
                    message: err.message || "Some error occured while updating user"
                });
            }
            if (!user) {
                return res.status(404).send({
                    message: "User not found"
                });
            }

            return res.status(200).send(user);
        }
    })

但是当我尝试通过Postman发送请求时,没有得到响应或错误。

2 个答案:

答案 0 :(得分:2)

FindByIdAndUpdate 默认情况下不会返回更新的文档,您应该添加选项 {new:true} 。您也有混合括号。如下所示:

User.findByIdAndUpdate(
    req.body.userId, 
    {
       $set: { 
          prot: [{ 
                id: req.body.lockId, 
                admin: req.body.isAdmin 
          }] 
       }
   }, 
   { new: true },
   function(err, user) {
        if (err) {
            return res.status(500).send({
                message: err.message || "Some error occured while updating user"
            });
        }
        if (!user) {
            return res.status(404).send({
                message: "User not found"
            });
        }

        return res.status(200).send(user);
    }
);

答案 1 :(得分:0)

如果要更新对象数组中的特定记录。您可以这样做。

  User.update(
      { _id: req.body.userId, 
        prot: 
            { $elemMatch: { id: req.body.lockId }}
      },
      { $set: 
            { prot: { admin: req.body.isAdmin }
      }
   },(error,result)=>{
      if(error){ 
         //handle error
      }
      console.log(result);
    } 
    )