web-dev-qa-db-fra.com

MongoError: Mod sur _id non autorisé

Il y a quelques questions à ce sujet mais je n'arrive pas à trouver une solution qui semble être l'approche acceptée pour le moment.

J'essaie de mettre à jour un document dans MongoDB et j'utilise Mongoosejs pour le faire. Cependant, je reçois cette erreur:

{ [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' }

Le code que j'utilise pour effectuer la mise à jour est le suivant:

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

parce que j'avais un "champ" appelé "short_id", je pensais que le fait d'avoir une partie "_id" dans le nom du champ pouvait poser problème, je l'ai donc changé en "court" mais je n'ai toujours pas eu de chance - je reçois la même erreur. J'ai découvert par la suite qu'il pensait que j'essayais de changer le champ _id mais je ne sais pas pourquoi.

15
tommyd456

Le problème était dû au fait que j'utilisais short (unique) pour trouver le document et le mettre à jour, et _id était envoyé comme valeur à mettre à jour, ce qui est impossible.

Par conséquent, avant d'envoyer les paramètres, j'ai supprimé le _id de l'objet.

delete the_object._id

et tout fonctionne maintenant.

28
tommyd456

Si vous utilisez lodash, le code suivant peut vous aider.

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

Des tests passaient localement sur MongoDB 3.x, mais je rencontrais cette erreur avec CircleCI (un service d'intégration continue) qui exécute une ancienne version (2.4.x).

Il s'avère que l'installation d'une version plus récente a résolu le problème que j'avais.

4
Pier-Luc Gendreau

Ce problème n'existe pas dans MongoDB version 3.6, mais il est devenu un problème sur notre serveur de production utilisant la version 2.4.

0
Alexander Mills