MongoDB objectID 陌生人错误

MongoDB objectID stranger Error

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

The _id field cannot be changed from {_id: ObjectId('56d4d71191fdc81100974d0b')} to {_id: "56d4d71191fdc81100974d0b"}.

看起来很奇怪,因为我在 updateOne 的服务器代码中使用与 findOne 相同的方法(同样,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();
    }
  });
});

有什么建议吗?

我认为你在 var updateDoc = req.body

有问题

由于 req.body 包含 id 字段,并且您正在通过该 id 从要更新的对象中搜索,mongodb 认为您正在尝试更新 id 字段也是不允许的。

一种解决方案是从 updateDoc 对象中删除 id 字段。 例如

delete updateDoc._id;

现在再试一次,看看是否有效。

您的最终函数应该如下所示

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();
    }
  });
});