MongoDB的objectID陌生人错误

在Heroku上使用MEAN Stack部署我能够通过mongoDB的findOnedeleteOne函数来GETDELETE文档。 但是,当我尝试使用mongoDB updateOne / update函数来放置文档时,我收到此错误(服务器端):

_id字段不能从{_id:ObjectId('56d4d71191fdc81100974d0b')}更改为{_id:“56d4d71191fdc81100974d0b”}。

似乎很奇怪,因为我在我的服务器代码中使用相同的方法updateOnefindOne (同样, findOne工作正常):

 app.get("/contacts/:id", function(req, res) { db.collection(CONTACTS_COLLECTION).findOne({ _id: new ObjectID(req.params.id) }, function(err, doc) { if (err) { handleError(err.message, "Failed to get contact"); } else { res.status(200).json(doc); } }); }); app.put("/contacts/:id", function(req, res) { var updateDoc = req.body; db.collection(CONTACTS_COLLECTION).updateOne({_id: new ObjectID(req.params.id)}, updateDoc, function(err, doc) { if (err) { handleError(err.message, "Failed to update contact"); } else { res.status(204).end(); } }); }); 

有什么build议么?

我认为你有问题var updateDoc = req.body

由于req.body包含id字段,并且您正在从对象中search以通过该id进行更新,因此mongodb认为您正试图更新id字段,这是不允许的。

一个解决scheme是从你的updateDoc对象中删除id字段。 例如

 delete updateDoc._id; 

现在再试一次,看看它是否工作。

你的最终function应该看起来像

 app.put("/contacts/:id", function(req, res) { var updateDoc = req.body; delete updateDoc.id; db.collection(CONTACTS_COLLECTION).updateOne({_id: new ObjectID(req.params.id)}, updateDoc, function(err, doc) { if (err) { handleError(err.message, "Failed to update contact"); } else { res.status(204).end(); } }); });