Ich möchte ein _id
Feld eines Dokuments aktualisieren . Ich weiß, dass es keine wirklich gute Übung ist. Aber aus irgendeinem technischen Grund muss ich es aktualisieren. Wenn ich versuche, es zu aktualisieren, erhalte ich:
> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'
Und das Update wird nicht gemacht. Wie kann ich es aktualisieren?
duplicate key error
in derinsert
Leitung haben und sich keine Sorgen über das erwähnte Problem @skelly machen, besteht die einfachste Lösung darin,remove
zuerst dieinsert
Leitung anzurufen und dann die Leitung anzurufen . Dasdoc
sollte bereits auf Ihrem Bildschirm gedruckt sein, damit es für einfache Dokumente leicht wiederhergestellt werden kann, im schlimmsten Fall, selbst wenn die Einfügung fehlschlägt.Um dies für Ihre gesamte Sammlung zu tun, können Sie auch eine Schleife verwenden (basierend auf dem Niels-Beispiel):
In diesem Fall war UserId die neue ID, die ich verwenden wollte
quelle
list()
ist die logische, aber für große Datenbanken kann dies den Speicher erschöpfenFalls Sie _id in derselben Sammlung umbenennen möchten (z. B. wenn Sie einige _ids voranstellen möchten):
if (doc._id.indexOf ("2019:")! = 0) {... wird benötigt, um eine Endlosschleife zu verhindern, da forEach die eingefügten Dokumente auch über die verwendete Methode .snapshot () auswählt .
quelle
find(...).snapshot is not a function
aber anders als das, tolle Lösung. Wenn Sie durch_id
Ihre benutzerdefinierte ID ersetzen möchten , können Sie auch überprüfen, obdoc._id.toString().length === 24
die Endlosschleife verhindert werden soll (vorausgesetzt, Ihre benutzerdefinierten IDs sind nicht auch 24 Zeichen lang ).Hier habe ich eine Lösung, die Mehrfachanforderungen für Schleifen und das Entfernen alter Dokumente vermeidet.
Sie können eine neue Idee einfach manuell erstellen, indem
_id:ObjectId()
Sie Folgendes verwenden: Wenn Sie jedoch wissen, dass Mongo automatisch eine _id zuweist, wenn diese fehlt, können Sie mithilfe des Aggregats eine erstellen,$project
die alle Felder Ihres Dokuments enthält, aber das Feld _id weglassen. Sie können es dann mit speichern$out
Also, wenn Ihr Dokument ist:
Dann lautet Ihre Anfrage:
quelle
_id
den Wert auf einen bestimmten Wert setzen, anstatt MongoDB einen anderen generieren zu lassen.Sie können auch ein neues Dokument aus dem MongoDB-Kompass oder mit dem Befehl erstellen und den
specific _id
gewünschten Wert festlegen .quelle