【问题标题】:Why is MongoDB FindByIdAndUpdate giving me an error?为什么 MongoDB FindByIdAndUpdate 给我一个错误?
【发布时间】:2017-12-17 23:01:47
【问题描述】:

我正在尝试使用以下代码更新 MongoDB 文档。当我运行它时,我收到以下错误:

error= MongoError: 将更新应用到文档 {_id: ObjectId('596684d72084af52d51b4574') , ...},(不可变)字段 '_id' 被发现已被更改为 _id: ObjectId('596734cd9a40f6561bcd0c2a')

我一辈子都看不到我在哪里更改 _id 字段。

谁能看出我做错了什么?

谢谢。

exports.updateSubmission_post = function(req, res) {
    var submission = new Submission();
    submission.publication = req.body.sub_publication;
    submission.submission_date = req.body.sub_submission_date;
    submission.response_date = req.body.sub_response_date;
    submission.response = req.body.sub_response;
Submission.findByIdAndUpdate(req.body.sub_submissionId, submission, {}, function (err, submission) {
        if (err) {
            console.log('error= ' + err);
            return err;
        }else{

【问题讨论】:

  • 当然,您正在“submission”中更改它,其中new 实例具有不同的_id 值。与其将整个对象扔到服务器上,不如学习通过$set 更新属性

标签: node.js mongodb mongoose


【解决方案1】:

您正在创建一个新文档:

var submission = new Submission()

Mongoose 将为该文档生成一个_id。

接下来,您使用另一个_id (req.body.sub_submissionId) 调用findByIdAndUpdate,可能来自现有 文档。

换句话说,您正在尝试使用具有不同 _id 的新文档来更新现有文档,这就是 MongoDB 返回错误的原因(因为您无法更新/更改文档的 _id 值已经在数据库中)。

相反,您应该传递一个包含要更新的字段的对象:

var submission = {};
submission.publication = req.body.sub_publication;
submission.submission_date = req.body.sub_submission_date;
submission.response_date = req.body.sub_response_date;
submission.response = req.body.sub_response;
Submission.findByIdAndUpdate(req.body.sub_submissionId, submission, ...)

这将(隐式)调用$set 来更新数据库中现有文档的那些字段。

【讨论】:

  • 谢谢。就这样整理好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多