In MongoDB kom je situaties tegen waarin je meerdere documenten in één bewerking wilt updaten. Je zou door documenten kunnen loopen en ze één voor één bijwerken, maar updateMany biedt een snellere, efficiëntere oplossing.
In deze korte tutorial leren we hoe je de updateMany-operator in MongoDB gebruikt en hoe je queries optimaliseert voor de best mogelijke performance.
Wil je een stevige basis leggen in de gegevensverwerkingsmogelijkheden van MongoDB met Python? Kijk dan eens naar de cursus Introduction to MongoDB in Python.
Een praktisch voorbeeld van het updaten van meerdere MongoDB-documenten
Om dit concept te illustreren, gebruiken we een praktisch voorbeeld waarin je meer dan één document tegelijk wilt updaten.
Gebruik de volgende gegevens als basis voor het voorbeeld:
[{"name":"Nic Raboy","title":"Master of Shenanigans","salary":50000,"last_raise_date": new Date("2013-06-01") },{"name":"Megan Grant","title":"Word Wrangler","salary":125000,"last_raise_date": new Date("2020-12-01") },{"name":"Tony Kim","title":"Alliance Czar","salary":80000,"last_raise_date": new Date("2025-02-01") },];Mogelijk gemaakt door
In de bovenstaande JSON hebben we drie medewerkers bij een fictief bedrijf. Het bedrijf wil iedereen een loonsverhoging geven als ze al een tijd geen aanpassing hebben gehad.
Om iedereen die in aanmerking komt te updaten, kunnen we de updateMany-operator in MongoDB gebruiken. Om onze taak te volbrengen, komen we mogelijk uit op een statement zoals het volgende:
db.employees.updateMany({"last_raise_date":{"$lte":newDate("2024-01-01")}},{"$mul":{"salary":1.06},"$set":{"last_raise_date":newDate()}});Mogelijk gemaakt door
Wat doet de bovenstaande updateMany-bewerking precies?
Even een stap terug: de updateMany-operator neemt twee parameters en optioneel een derde parameter.
De eerste parameter is een object dat de gegevens vertegenwoordigt waarop we willen filteren.
De tweede parameter zijn de wijzigingen die we willen aanbrengen in de resultaten die door het filter zijn gevonden.
De optionele derde parameter kan { “upsert”: true } zijn, wat een document zou invoegen als er geen overeenkomsten zijn.
Met dat in gedachten filteren we eerst op alle documenten waarbij de last_raise_date eerder is dan "2024-01-01". Kijkend naar onze zeer eenvoudige dataset, weten we dat twee van de drie documenten overeenkomen:
[{"name":"Nic Raboy","title":"Master of Shenanigans","salary":50000,"last_raise_date": new Date("2013-06-01") },{"name":"Megan Grant","title":"Word Wrangler","salary":125000,"last_raise_date": new Date("2020-12-01") }];Mogelijk gemaakt door
Op basis van de wijzigingscriteria worden twee verschillende aanpassingen gedaan aan de gefilterde documenten.
We gebruiken eerst de $mul-operator om een van onze velden met een waarde te vermenigvuldigen. In ons voorbeeld willen we elke in aanmerking komende medewerker een salarisverhoging van 6% geven. Dit betekent dat we eenvoudig de huidige waarde van het veld vermenigvuldigen met 1,06.
Om de salarisaanpassingen te documenteren en tevens toekomstige per ongeluk uitgevoerde verhogingen te voorkomen, willen we de last_raise_date bijwerken naar de huidige datum:
Als we onze updateMany-bewerking opnieuw zouden uitvoeren, gebeurt er niets, omdat de last_raise_date in het filter niet langer overeenkomt met een van onze drie documenten.
Het bovenstaande is slechts een voorbeeld, maar je filtercriteria kunnen veel complexer zijn en hetzelfde geldt voor wat je wilt wijzigen, afhankelijk van je usecase. Je kunt meer leren over MongoDB's updateMany in deze video.
Versnel de performance van je update met een MongoDB-index
In ons voorbeeld werkten we met drie kleine documenten. Welke bewerking we ook op onze collectie loslaten, het zal snel gaan omdat het om weinig gaat. Denk echter aan een productieapplicatie waarin je met miljoenen documenten werkt of de updatebewerking vaak draait.
Als we de updateMany-operator op miljoenen documenten zouden gebruiken, kan het even duren, tenzij we een geschikte index hebben ingesteld voor onze filtercriteria.
Om voor ons voorbeeld een index te maken, kunnen we zoiets uitvoeren:
Je kunt valideren dat de updateMany-bewerking onze index gebruikt door het volgende uit te voeren:
db.runCommand({"explain":{"update":"employees","updates":[{"q":{"last_raise_date":{"$lte":newDate("2024-01-01")}},"u":{"$mul":{"salary":1.06},"$set":{"last_raise_date":newDate()}}}]},"verbosity":"allPlansExecution"});Mogelijk gemaakt door
Als in de resultaten de inputStage "IXSCAN" is, dan gebruik je een index en maximaliseer je de performance van updateMany. Als de inputStage "COLLSCAN" is, gebruik je geen index en moet je mogelijk heroverwegen hoe je je index maakt op basis van je filtercriteria.
Ter verduidelijking: we gebruiken hierboven runCommand om onze bewerking voor het updaten van meerdere documenten te profileren. Als je geen profilerinformatie nodig hebt, houd het dan bij de veel eenvoudigere en elegantere updateMany-bewerking.
Conclusie
Meerdere documenten in één bewerking updaten in MongoDB is niet moeilijk, zoals in de hele tutorial te zien is.
Met de updateMany-operator kunnen we filtercriteria definiëren om onze documenten op te matchen en vervolgens wijzigingscriteria met een lijst aan aanpassingen. Deze updateMany-bewerking kun je verder optimaliseren door te zorgen voor een geschikte index die past bij je filtercriteria.
Ben je nieuw met niet-relationele databases? De cursus Introduction to NoSQL biedt een handig overzicht van concepten zoals document stores.
FAQs
Wat is het verschil tussen updateOne en updateMany in MongoDB?⌄
updateOne wijzigt het eerste overeenkomende document, terwijl updateMany alle documenten bijwerkt die aan de filtercriteria voldoen. Kies op basis van de gewenste reikwijdte van de wijziging.
Kan updateMany met upsert worden gebruikt in MongoDB?⌄
Ja, door { upsert: true } als derde argument toe te voegen, wordt een nieuw document ingevoegd als er geen overeenkomsten worden gevonden. Het wordt echter vaker gebruikt met updateOne.
Wat zijn veelvoorkomende usecases voor updateMany?⌄
Het wordt vaak gebruikt voor batchupdates, zoals het aanpassen van prijzen, het wijzigen van gebruikersstatussen of het opschonen van verouderde velden in grote datasets.
Geeft updateMany resultaatgegevens terug?⌄
Ja, het retourneert een object met informatie zoals matchedCount en modifiedCount, die aangeven hoeveel documenten zijn gematcht en bijgewerkt.
Wat gebeurt er als geen documenten aan het filter voldoen in updateMany?⌄
Als er geen documenten overeenkomen en upsert niet is gebruikt, wordt de bewerking zonder wijzigingen voltooid. Er wordt geen foutmelding gegenereerd.
Is updateMany atomair in MongoDB?⌄
Nee, het is niet atomair over meerdere documenten. Elke documentupdate is op zichzelf atomair, maar niet gezamenlijk.
Hoe kan ik de performance van updateMany-bewerkingen testen?⌄
Gebruik de methoden explain() of runCommand({ explain: ... }) om te zien of je query een index gebruikt of een collectiescan uitvoert.
Kan ik meerdere update-operators chainen in updateMany?⌄
Ja, MongoDB ondersteunt het combineren van operators zoals $set, $inc, $mul, etc., in één enkele updateMany-aanroep.
Wat is de impact van indexen op updateMany-bewerkingen?⌄
Indexes kunnen de performance drastisch verbeteren door het aantal gescande documenten tijdens het filteren te verminderen.
Hoe maak ik een onbedoelde updateMany-bewerking ongedaan?⌄
Je moet herstellen vanaf een back-up of log, want MongoDB heeft geen ingebouwde rollback voor updateMany. Test altijd eerst op staging en maak een back-up van productiedata.
Auteur
Nic Raboy
Nic Raboy is een Developer Relations Lead bij MongoDB, waar hij een team van Python-, Java-, C#- en PHP-ontwikkelaars aanstuurt dat geweldige content maakt om developers te helpen MongoDB succesvol in hun projecten op te nemen. Hij heeft ervaring met Golang en JavaScript en schrijft vaak over zijn ontwikkelavonturen.
In MongoDB kom je situaties tegen waarin je meerdere documenten in één bewerking wilt updaten. Je zou door documenten kunnen loopen en ze één voor één bijwerken, maar
updateManybiedt een snellere, efficiëntere oplossing.In deze korte tutorial leren we hoe je de updateMany-operator in MongoDB gebruikt en hoe je queries optimaliseert voor de best mogelijke performance.
Wil je een stevige basis leggen in de gegevensverwerkingsmogelijkheden van MongoDB met Python? Kijk dan eens naar de cursus Introduction to MongoDB in Python.
Een praktisch voorbeeld van het updaten van meerdere MongoDB-documenten
Om dit concept te illustreren, gebruiken we een praktisch voorbeeld waarin je meer dan één document tegelijk wilt updaten.
Gebruik de volgende gegevens als basis voor het voorbeeld:
In de bovenstaande JSON hebben we drie medewerkers bij een fictief bedrijf. Het bedrijf wil iedereen een loonsverhoging geven als ze al een tijd geen aanpassing hebben gehad.
Om iedereen die in aanmerking komt te updaten, kunnen we de
updateMany-operator in MongoDB gebruiken. Om onze taak te volbrengen, komen we mogelijk uit op een statement zoals het volgende:Wat doet de bovenstaande
updateMany-bewerking precies?Even een stap terug: de
updateMany-operator neemt twee parameters en optioneel een derde parameter.{ “upsert”: true }zijn, wat een document zou invoegen als er geen overeenkomsten zijn.Met dat in gedachten filteren we eerst op alle documenten waarbij de
last_raise_dateeerder is dan "2024-01-01". Kijkend naar onze zeer eenvoudige dataset, weten we dat twee van de drie documenten overeenkomen:Op basis van de wijzigingscriteria worden twee verschillende aanpassingen gedaan aan de gefilterde documenten.
We gebruiken eerst de
$mul-operator om een van onze velden met een waarde te vermenigvuldigen. In ons voorbeeld willen we elke in aanmerking komende medewerker een salarisverhoging van 6% geven. Dit betekent dat we eenvoudig de huidige waarde van het veld vermenigvuldigen met 1,06.Om de salarisaanpassingen te documenteren en tevens toekomstige per ongeluk uitgevoerde verhogingen te voorkomen, willen we de
last_raise_datebijwerken naar de huidige datum:Als we onze
updateMany-bewerking opnieuw zouden uitvoeren, gebeurt er niets, omdat delast_raise_datein het filter niet langer overeenkomt met een van onze drie documenten.Het bovenstaande is slechts een voorbeeld, maar je filtercriteria kunnen veel complexer zijn en hetzelfde geldt voor wat je wilt wijzigen, afhankelijk van je usecase. Je kunt meer leren over MongoDB's updateMany in deze video.
Versnel de performance van je update met een MongoDB-index
In ons voorbeeld werkten we met drie kleine documenten. Welke bewerking we ook op onze collectie loslaten, het zal snel gaan omdat het om weinig gaat. Denk echter aan een productieapplicatie waarin je met miljoenen documenten werkt of de updatebewerking vaak draait.
Als we de
updateMany-operator op miljoenen documenten zouden gebruiken, kan het even duren, tenzij we een geschikte index hebben ingesteld voor onze filtercriteria.Om voor ons voorbeeld een index te maken, kunnen we zoiets uitvoeren:
Je kunt valideren dat de
updateMany-bewerking onze index gebruikt door het volgende uit te voeren:Als in de resultaten de
inputStage"IXSCAN" is, dan gebruik je een index en maximaliseer je de performance vanupdateMany. Als deinputStage"COLLSCAN" is, gebruik je geen index en moet je mogelijk heroverwegen hoe je je index maakt op basis van je filtercriteria.Ter verduidelijking: we gebruiken hierboven
runCommandom onze bewerking voor het updaten van meerdere documenten te profileren. Als je geen profilerinformatie nodig hebt, houd het dan bij de veel eenvoudigere en elegantereupdateMany-bewerking.Conclusie
Meerdere documenten in één bewerking updaten in MongoDB is niet moeilijk, zoals in de hele tutorial te zien is.
Met de
updateMany-operator kunnen we filtercriteria definiëren om onze documenten op te matchen en vervolgens wijzigingscriteria met een lijst aan aanpassingen. DezeupdateMany-bewerking kun je verder optimaliseren door te zorgen voor een geschikte index die past bij je filtercriteria.Ben je nieuw met niet-relationele databases? De cursus Introduction to NoSQL biedt een handig overzicht van concepten zoals document stores.