mongoose Mongo服务器错误:对路径'_id'执行更新将修改不可变字段'_id'

xxls0lw8  于 2022-11-13  发布在  Go
关注(0)|答案(3)|浏览(268)

我尝试使用MongoDB在Nodejs中创建一个CRUD应用程序,但是当我编写更新部分并使用 Postman 发送时,终端中显示错误:

**MongoServerError: Performing an update on the path '_id' would modify the immutable field '_id'**

下面是我在mongo db中更新bu _id条目的代码

router.put('/api/employee/edit/:id' ,(req,res) =>{

    const emp = new Employee({
        
        
        name:req.body.name,
        email:req.body.email,
        salary:req.body.salary
    });
    Employee.findByIdAndUpdate(req.params.id, {$set: emp},(err,data) => {

        if(!err){
                res.status(200).json({code:200,message:"Employee updated successfully",
            updateEmployee:data
            
            })
           

        }
        else{
            console.log(err);

                
        }

    })

    })
r7knjye2

r7knjye21#

我假设把整个对象作为参数给$set意味着它会尝试修改它的所有属性,包括不应该修改的_id,而你还没有在对象上设置它。尝试分别指定要修改的属性:

Employee.findByIdAndUpdate(req.params.id, {$set: {
    name:req.body.name,
    email:req.body.email,
    salary:req.body.salary
}},(err,data) => {
wwtsj6pe

wwtsj6pe2#

您正在创建一个新的Employee文档,并希望用该新文档更新当前文档。您不能这样做,因为这样做也会尝试覆盖该文档的_id。您应该用新数据更新现有文档,而不是创建一个新的Employee文档:

router.put('/api/employee/edit/:id', (req, res) => {

  Employee.findByIdAndUpdate(req.params.id, {
    name: req.body.name,
    email: req.body.email,
    salary: req.body.salary
  }, { new: true }, (err, data) => {
    
    if (!err) {
      res.status(200).json({ code: 200, message: "Employee updated successfully", updateEmployee: data })
    } else {
      res.status(400).json({ code: 400, message: "Employee updated failed." })
    }
  })
})
cnwbcb6i

cnwbcb6i3#

我们的想法是永远不要传递值 要更新'_id',您可以从实体中提取ID并发送其他值。例如:

const unmarshalled = Employee.unmarshal(); 
const {_id, ...values} = unmarshalled;
const doc: Document = await model.findByIdAndUpdate(_id, values, { useFindAndModify: false }).exec();

相关问题