Hoe unieke object ids in te stellen in ingesloten documenten in een MongoDB collectie

MongoDB's updateMany kan worden gebruikt om alle documenten die overeenkomen bij te werken.

Probleem

Als je echter unieke nieuwe ObjectID's wilt instellen in je update, zou je merken dat MongoDB dezelfde ObjectID instelt voor elk item:

db.getCollection('mypis_collectedpis').updateMany({}, {$set:
     {apps: {
         "com.picockpit/core": {
             meta: {
                 versie: "2.0",
                 naam: "PiCockpit Core",
                 beeld: "",
                 beschrijving: "PiCockpit.com kern toepassing"
                 }
             },
             id: ObjectId()
         },
      ts: ISODate(“2020-07-23T08:42:41.052Z”)}
    })

afbeelding

Dat komt omdat het ObjectId eenmalig wordt aangemaakt en dan voor elke bijwerking wordt gebruikt.

Oplossing

Je moet met een cursor over de afzonderlijke documenten lopen, en de ObjectID's instellen.

Eerste stap

Update / stel de waarden in die in al uw documenten hetzelfde zullen zijn.

Ik stel voor om de verschillende waarden in deze stap al op nul te zetten:

db.getCollection('mypis_collectedpis').updateMany({}, {$set:
     {apps: {
         "com.picockpit/core": {
             meta: {
                 versie: "2.0",
                 naam: "PiCockpit Core",
                 beeld: "",
                 beschrijving: "PiCockpit.com kern toepassing"
                 }
             },
             id: null
         },
      ts: ISODate(“2020-07-23T08:42:41.052Z”)}
    })

afbeelding

NB: Ik gebruik Robo 3T voor een meer comfortabele ervaring dan de MongoDB command line shell.

krijg je:

afbeelding

Tweede stap

Itereer door de documenten, en werk elk bij met updateOne:

db.getCollection('mypis_collectedpis').find().forEach((pi) => {
     print("Bijwerken" + pi.naam + " met ObjectId: " + pi._id);
     db.getCollection('mypis_collectedpis').updateOne({_id: pi._id}, {$set: {"apps.id": ObjectId()}});
     })

afbeelding

Let op de puntnotatie voor toegang tot items in een ingesloten document - voor de puntnotatie moet de itemsleutel tussen aanhalingstekens staan!

Tussen haakjes, dit is de output die dit genereert:

afbeelding

en dit is het resultaat, voor twee verschillende ingangen:

afbeelding

afbeelding

De ObjectID's zijn bijgewerkt met verschillende waarden.

Belangrijke opmerking

Merk op dat er in deze code geen locks / geen transacties zijn - om deze oplossing te laten werken, zou je exclusieve toegang tot de database moeten hebben, of ervoor zorgen dat de gegevens niet worden gewijzigd terwijl je aan de database werkt.

Anders moet een of andere bijwerkingsregeling worden ingevoerd - een oefening die aan de lezer wordt overgelaten.

Met dank aan Maximilian Schwarzmüller voor zijn Udemy MongoDB cursus, en de uitstekende MongoDB online documentatie!