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

Bild

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

Bild

NB: Ich verwende Robo 3T, weil es bequemer ist als die MongoDB-Befehlszeilen-Shell.

erhalten Sie:

Bild

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

Bild

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:

Bild

und das ist das Ergebnis, für zwei verschiedene Einträge:

Bild

Bild

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!