使用带有 findOneAndUpdate 的唯一字段更新文档抛出异常

update document using a unique filed with findOneAndUpdate is thorwing exception

我是 node.js 的新手,意思是。

我在文档中有将近 20 个字段要更新。

var UserSchema = mongoose.model('UserSchema');

我正在 request body 中传递这 20 个字段并更新 UserSchema 模型对象。

var newUser =new  UserSchema(req.body);

实际上我并没有从我的请求正文中传递 _id,但是当我看到我的 newUser._id 时它填充了一些 id,所以它导致了一个名为

的错误
exception: After applying the update to the document {_id: ObjectId('560e506ad4369d2a02a6ad6d') , ...}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('560e65f395857e210313d3a7')



  UserSchema.findOneAndUpdate({ userName: newUser.userName }, newUser, { new: true }, function (err, newuser) {
      if (err) {
        console.log(err);
        return res.status(400).json({ message: err });
      }
      return res.status(200).json({ result: newUser });
    });

因为您正在通过以下语句创建新记录集,

 var newUser =new  UserSchema(req.body);

以上语句将 req.body 提供的所有字段与 UserSchema 模型的注册架构相匹配,并将为其生成新的 ObjectId。所以 newUser 变量有 _id 字段,当你尝试用 newUser 更新现有记录时,它会导致错误,因为你试图更改不可变的 _id 字段。

相反,您可以按如下方式重写整个内容,

var UserSchema = mongoose.model('UserSchema');
var newUser = req.body;

UserSchema.findOneAndUpdate({ userName: newUser.userName }, newUser, { new: true }, function (err, newuser) {
      if (err) {
        console.log(err);
        return res.status(400).json({ message: err });
      }
      return res.status(200).json({ result: newUser });
    });

如果提供的记录不存在,那么 findOneAndUpdate 将根据您提供的 new: true 标志插入新记录。