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”)}
})
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”)}
})
NB: Ik gebruik Robo 3T voor een meer comfortabele ervaring dan de MongoDB command line shell.
krijg je:
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()}});
})
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:
en dit is het resultaat, voor twee verschillende ingangen:
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!