Festlegen eindeutiger Objekt-IDs in eingebetteten Dokumenten in einer MongoDB-Sammlung
MongoDBs updateMany kann verwendet werden, um alle Dokumente zu aktualisieren, die übereinstimmen.
Problem
Wenn Sie jedoch bei der Aktualisierung eindeutige neue ObjectIDs setzen wollen, werden Sie feststellen, dass MongoDB für jeden Eintrag die gleiche ObjectID setzt:
db.getCollection('mypis_collectedpis').updateMany({}, {$set:
{apps: {
"com.picockpit/core": {
meta: {
Version: "2.0",
Name: "PiCockpit Core",
Bild: "",
Beschreibung: "PiCockpit.com Kernanwendung"
}
},
id: ObjectId()
},
ts: ISODate(“2020-07-23T08:42:41.052Z”)}
})
Dies liegt daran, dass die ObjectId einmal erstellt und dann für jede Aktualisierung verwendet wird.
Lösung
Sie müssen mit einem Cursor über die einzelnen Dokumente iterieren und die ObjectIDs setzen.
Erster Schritt
Aktualisieren Sie die Werte, die in allen Ihren Dokumenten gleich sein sollen.
Ich schlage vor, die eindeutigen Werte bereits in diesem Schritt zunächst auf Null zu setzen:
db.getCollection('mypis_collectedpis').updateMany({}, {$set:
{apps: {
"com.picockpit/core": {
meta: {
Version: "2.0",
Name: "PiCockpit Core",
Bild: "",
Beschreibung: "PiCockpit.com Kernanwendung"
}
},
id: null
},
ts: ISODate(“2020-07-23T08:42:41.052Z”)}
})
NB: Ich verwende Robo 3T, weil es bequemer ist als die MongoDB-Befehlszeilen-Shell.
erhalten Sie:
Zweiter Schritt
Iterieren Sie über die Dokumente und aktualisieren Sie jedes mit updateOne:
db.getCollection('mypis_collectedpis').find().forEach((pi) => {
print("Aktualisierung" + pi.name + " mit ObjectId: " + pi._id);
db.getCollection('mypis_collectedpis').updateOne({_id: pi._id}, {$set: {"apps.id": ObjectId()}});
})
Beachten Sie die Punktschreibweise für den Zugriff auf Einträge in einem eingebetteten Dokument - für die Punktschreibweise muss der Eintragsschlüssel in Anführungszeichen gesetzt werden!
Das ist übrigens die Ausgabe, die dabei entsteht:
und das ist das Ergebnis, für zwei verschiedene Einträge:
Die ObjectIDs wurden mit eindeutigen Werten aktualisiert.
Wichtiger Hinweis
Beachten Sie, dass es in diesem Code keine Sperren / keine Transaktionen gibt - damit diese Lösung funktioniert, müssten Sie exklusiven Zugriff auf die Datenbank haben oder sicherstellen, dass die Daten nicht geändert werden, während Sie an der Datenbank arbeiten.
Andernfalls muss eine Art Aktualisierungsschema erstellt werden - eine Aufgabe, die dem Leser überlassen bleibt.
Vielen Dank an Maximilian Schwarzmüller für seinen Udemy MongoDB-Kurs und die hervorragende MongoDB-Online-Dokumentation!