MongoError: Mod on _id не разрешено

Есть несколько вопросов по этому поводу, но я пока не могу найти решение, которое, похоже, является приемлемым подходом на данный момент.

Я пытаюсь обновить документ в 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" части имени поля, поэтому я изменил его на "короткий", но все равно не повезло - я получаю ту же ошибку, Позднее я обнаружил, что он думает, что я пытаюсь изменить поле _id, но не знаю почему.

Ответы

Ответ 1

Проблема заключалась в том, что я использовал short (который уникален), чтобы найти документ и обновить его, а _id отправляется как значение для обновления, которое не может быть выполнено.

Поэтому перед отправкой параметров я удалил _id из объекта.

delete the_object._id

и теперь все работает.

Ответ 2

Если вы используете lodash, следующий код может помочь.

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

Ответ 3

У меня были тесты, проходящие локально на MongoDB 3.x, но я получал эту ошибку в CircleCI (службе непрерывной интеграции), которая запускает старую версию (2.4.x)

Оказывается, установка новой версии устраняет проблему, с которой я столкнулся.

Ответ 4

Эта проблема не существует в версии MongoDB 3.6, но на нашем производственном сервере с использованием версии 2.4 это стало проблемой.