【问题标题】:MongoDB objectID stranger ErrorMongoDB objectID 陌生人错误
【发布时间】:2016-06-16 04:38:08
【问题描述】:

在 Heroku 上使用 MEAN Stack 部署,我可以使用 mongoDB 的 findOnedeleteOne 函数来处理 GETDELETE 文档。但是,当我尝试使用 mongoDB updateOne/update 函数 PUT 一个文档时,我收到此错误(服务器端):

_id 字段不能从 {_id: ObjectId('56d4d71191fdc81100974d0b')} 更改为 {_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();
    }
  });
});

有什么建议吗?

【问题讨论】:

  • 您正在进行更新,并且您更新的文档包含一个 _id,Mongo 不喜欢这样。从 updateDoc 中删除 _id:delete updateDoc._jd.

标签: node.js mongodb heroku mean-stack objectid


【解决方案1】:

我认为你在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();
    }
  });
});

【讨论】:

  • 效果很好。非常感谢。我在这上面花了太长时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2014-11-07
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多