it-swarm.com.de

MongoError: Mod on _id nicht erlaubt

Es gibt ein paar Fragen dazu, aber ich kann anscheinend keine Lösung finden, die im Moment als akzeptierter Ansatz erscheint.

Ich versuche, ein Dokument in MongoDB zu aktualisieren und verwende Mongoosejs, um dies zu tun. Ich erhalte jedoch diesen Fehler:

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

Der Code, den ich für das Update verwende, lautet:

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

da ich ein "Feld" mit dem Namen "short_id" hatte, dachte ich, dass es ein Problem mit dem "_id" -Teil des Feldnamens geben könnte. Daher habe ich es in "short" geändert, aber immer noch kein Glück - ich erhalte den gleichen Fehler. Ich habe später festgestellt, dass es denkt, ich versuche, das Feld _id zu ändern, aber ich weiß nicht warum.

15
tommyd456

Das Problem bestand darin, dass ich short (die eindeutig ist) verwendet habe, um das Dokument zu finden und zu aktualisieren, und _id wurde als zu aktualisierender Wert gesendet, was nicht möglich ist.

Daher habe ich vor dem Versenden der Parameter den _id aus dem Objekt gelöscht.

delete the_object._id

und alles funktioniert jetzt.

28
tommyd456

Wenn Sie lodash verwenden, kann der folgende Code helfen.

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

Ich hatte Tests, die lokal auf MongoDB 3.x bestanden haben, aber ich bekam diesen Fehler in CircleCI (einem kontinuierlichen Integrationsdienst), auf dem eine alte Version (2.4.x) ausgeführt wird.

Es stellte sich heraus, dass die Installation einer neueren Version das Problem behebt, das ich hatte.

4

Dieses Problem ist in MongoDB Version 3.6 nicht vorhanden, aber auf unserem Produktionsserver mit Version 2.4 wurde es zu einem Problem.

0
Alexander Mills