【问题标题】:MongoError: Mod on _id not allowedMongoError: Mod on _id not allowed
【发布时间】:2014-07-29 00:43:54
【问题描述】:

对此有一些问题,但我似乎无法找到目前似乎被接受的解决方案。

我正在尝试更新 MongoDB 中的文档,并且正在使用 Mongoosejs 来执行此操作。但是,我收到了这个错误:

{ [MongoError: Mod on _id not allowed]
  name: 'MongoError',
  lastErrorObject:
   { err: 'Mod on _id not allowed',
     code: 10148,
     n: 0,
     connectionId: 35,
     ok: 1 },
  ok: 0,
  errmsg: 'Mod on _id not allowed' }

我用来进行更新的代码是:

app.put('/task/:short', auth, function (req, res) {
  Task.findOneAndUpdate({short:req.params.short}, req.body, function(err, task) {
    if(err) console.log(err);
    res.json(200, {content: task});
  })
});

因为我有一个名为“short_id”的“字段”,我认为字段名称中包含“_id”部分可能是个问题,所以我将其更改为“short”,但仍然没有运气 - 我得到了同样的错误.后来我发现它认为我正在尝试更改 _id 字段,但我不知道为什么。

【问题讨论】:

  • 你作为 req.body 传入了什么?
  • 我在req.body 中传递了_id,我不应该对吗?
  • 嗯,不,_id 应该只(可能)在搜索部分,而不是更新部分(req.body)
  • 记录是使用 short 部分找到的,这也是唯一的 - 我认为错误正在发生,因为我也在发送 _id 字段。只是检查
  • 是的,似乎已经解决了。

标签: node.js mongodb express mongoose


【解决方案1】:

这个问题在 MongoDB 3.6 版中不存在,但在我们使用 2.4 版的生产服务器上它成为了一个问题。

【讨论】:

    【解决方案2】:

    我在 MongoDB 3.x 上通过本地测试,但在运行旧版本 (2.4.x) 的 CircleCI(持续集成服务)中遇到此错误

    原来安装更新的版本解决了我遇到的问题。

    【讨论】:

      【解决方案3】:

      如果你使用的是 lodash,下面的代码会有所帮助..

      var id = update._id;
      var update = _.omit(update,'_id');
      mongo.mCustomers.findOneAndUpdate({_id:id},update,callback);
      

      【讨论】:

        【解决方案4】:

        问题是因为我使用 short(它是唯一的)来查找文档并更新它,而 _id 被发送为无法更新的值。

        因此,在发送参数之前,我从对象中删除了_id

        delete the_object._id
        

        现在一切正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-09
          • 2017-09-30
          • 1970-01-01
          • 2018-12-29
          • 2022-12-22
          • 2014-07-27
          • 2012-08-30
          相关资源
          最近更新 更多