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