Accéder au contenu principal

Comment utiliser updateMany() dans MongoDB pour modifier plusieurs documents ?

Apprenez à utiliser et à optimiser les performances de l'opérateur updateMany() dans MongoDB pour mettre à jour plusieurs documents en une seule opération.
Actualisé 13 juin 2025  · 4 min de lecture

Avec MongoDB, il peut arriver que vous souhaitiez mettre à jour plusieurs documents en une seule opération. Vous pourriez parcourir les documents en boucle et les mettre à jour individuellement, mais updateMany offre une solution plus rapide et plus efficace.

Dans ce court tutoriel, nous allons apprendre à utiliser l'opérateur updateMany dans MongoDB et à optimiser les requêtes pour obtenir les meilleures performances possibles.

Pour acquérir des bases solides sur les capacités de traitement des données de MongoDB à l'aide de Python, pensez à explorer le cours sur l' introduction à MongoDB en Python.

Exemple pratique de mise à jour de plusieurs documents MongoDB

Pour illustrer ce concept, prenons un exemple pratique dans lequel vous pourriez vouloir mettre à jour plusieurs documents à la fois.

Prenons les données suivantes comme base de l'exemple :

[
    { "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") },
];

Dans le JSON ci-dessus, nous avons trois employés dans une entreprise fictive. L'entreprise souhaite donner un coup de pouce à la rémunération de tous ceux qui n'ont pas reçu d'adaptation salariale depuis un certain temps.

Pour mettre à jour toutes les personnes qualifiées, nous pouvons utiliser l'opérateur updateMany de MongoDB. Pour accomplir notre tâche, nous pourrions obtenir une déclaration qui ressemblerait à la suivante :

db.employees.updateMany(
    {
        "last_raise_date": {
            "$lte": new Date("2024-01-01")
        }
    },
    {
        "$mul": { "salary": 1.06 },
        "$set": { "last_raise_date": new Date() }
    }
);

Que fait donc l'opération updateMany ci-dessus ?

L'opérateur updateMany prend deux paramètres et un troisième paramètre facultatif. 

  • Le premier paramètre est un objet représentant les données que nous voulons filtrer. 
  • Le deuxième paramètre correspond aux modifications que nous voulons apporter aux résultats trouvés dans le filtre. 
  • Le troisième paramètre facultatif peut être { “upsert”: true }, qui insère un document s'il n'y a pas de correspondance.

Dans cette optique, nous commençons par filtrer tous les documents dont le last_raise_date est antérieur à "2024-01-01". Si nous reprenons notre ensemble de données de base, nous savons que deux des trois documents correspondent :

[
    { "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") }
];

Deux modifications différentes seront apportées aux documents filtrés en fonction du paramètre des critères de modification.

"$mul": { "salary": 1.06 },

Tout d'abord, nous utilisons l'opérateur $mul pour multiplier l'un de nos champs par une valeur. Dans notre exemple, nous voulons accorder une augmentation de salaire de 6 % à chaque salarié remplissant les conditions requises. Cela signifie que nous multiplions simplement la valeur actuelle du champ par 1,06.

Pour nous aider à documenter les ajustements salariaux tout en évitant les augmentations accidentelles à l'avenir, nous voulons mettre à jour le site last_raise_date à la date actuelle :

"$set": { "last_raise_date": new Date() }

Si nous devions relancer notre opération updateMany, il ne se passerait rien car le last_raise_date trouvé dans le filtre ne correspondrait plus à aucun de nos trois documents.

Ce qui précède n'est qu'un exemple, mais vos critères de filtrage pourraient être beaucoup plus complexes et, de la même manière, ce que vous envisagez de modifier pourrait également être plus complexe, en fonction de votre cas d'utilisation.

Boostez la performance de votre mise à jour avec un index MongoDB

Dans notre exemple, nous avons travaillé avec trois petits documents. Quelle que soit l'opération à laquelle nous soumettons notre collection, elle sera rapide car nous ne travaillerons pas avec beaucoup d'éléments. Cependant, pensez à une application de production dans laquelle vous travaillez avec des millions de documents ou dans laquelle vous exécutez fréquemment l'opération de mise à jour.

Si nous essayions d'utiliser l'opérateur updateMany sur des millions de documents, cela pourrait prendre un certain temps, à moins que nous ne disposions d'un index adéquat pour nos critères de filtrage.

Pour créer un index pour notre exemple, nous pouvons exécuter quelque chose comme ceci :

db.employees.createIndex({ "last_raise_date": 1 });

Vous pouvez valider que l'opération updateMany utilise notre index en exécutant ce qui suit :

db.runCommand({
    "explain": {
        "update": "employees",
        "updates": [
            {
                "q": { 
                    "last_raise_date": { 
                        "$lte": new Date("2024-01-01") 
                    }
                },
                "u": {
                    "$mul": { "salary": 1.06 },
                    "$set": { "last_raise_date": new Date() }
                }
            }
        ]
    },
    "verbosity": "allPlansExecution"
});

Dans les résultats, si le site inputStage est "IXSCAN", vous utilisez un index et maximisez les performances de votre site updateMany. Si l'adresse inputStage est "COLLSCAN", vous n'utilisez pas d'index et vous devez peut-être revoir la façon dont vous créez votre index en fonction de vos critères de filtrage.

Pour dissiper toute confusion, nous utilisons runCommand pour décrire notre opération de mise à jour de plusieurs documents. Si vous n'avez pas besoin d'informations de profilage, contentez-vous de l'opération updateMany, beaucoup plus simple et élégante.

Conclusion

La mise à jour de plusieurs documents en une seule opération dans MongoDB n'est pas une tâche difficile, comme nous l'avons vu tout au long du tutoriel. 

En utilisant l'opérateur updateMany, nous pouvons définir un critère de filtrage pour comparer nos documents, puis un critère de modification avec une liste de changements à effectuer. Cette opération updateMany peut être encore optimisée en vous assurant que vous disposez d'un index approprié correspondant à vos critères de filtrage.

Si vous ne connaissez pas encore les bases de données non relationnelles, le cours Introduction à NoSQL offre un aperçu utile de concepts tels que les magasins de documents.

Devenez ingénieur en données

Faites la preuve de vos compétences en tant qu'ingénieur en données prêt à l'emploi.
Accélérer ma carrière dans les données

FAQ

Quelle est la différence entre updateOne et updateMany dans MongoDB ?

 updateOne modifie le premier document correspondant, tandis que updateMany met à jour tous les documents qui répondent aux critères de filtrage. Choisissez en fonction de l'ampleur du changement souhaité.

Peut-on utiliser updateMany avec upsert dans MongoDB ?

Oui, en ajoutant { upsert: true } comme troisième argument, vous insérerez un nouveau document si aucune correspondance n'est trouvée. Cependant, il est plus couramment utilisé avec updateOne.

Quels sont les cas d'utilisation courants de updateMany ?

Il est souvent utilisé pour les mises à jour par lots, comme l'ajustement des prix, la modification des statuts des utilisateurs ou le nettoyage des champs obsolètes dans les grands ensembles de données.

updateMany renvoie-t-il des données de résultat ?

Oui, il renvoie un objet contenant des informations telles que matchedCount et modifiedCount, indiquant combien de documents ont été mis en correspondance et mis à jour.

Que se passe-t-il si aucun document ne correspond au filtre dans updateMany ?

Si aucun document ne correspond et que upsert n'est pas utilisé, l'opération se termine sans modification. Il n'y a pas d'erreur.

updateMany est-il atomique dans MongoDB ?

Non, il n'est pas atomique dans plusieurs documents. Chaque mise à jour de document est atomique en soi, mais pas collectivement.

Comment puis-je tester la performance des opérations updateMany ?

Utilisez les méthodes explain() ou runCommand({ explain: ... }) pour savoir si votre requête utilise un index ou effectue un balayage de collection.

Puis-je enchaîner plusieurs opérateurs de mise à jour dans updateMany ?

Oui, MongoDB prend en charge la combinaison d'opérateurs tels que $set, $inc, $mul, etc., en un seul appel à updateMany.

Quel est l'impact des index sur les opérations updateMany ?

Les index peuvent améliorer considérablement les performances en réduisant le nombre de documents numérisés lors du filtrage.

Comment annuler une opération updateMany accidentelle ?

Vous devez restaurer à partir d'une sauvegarde ou d'un journal, car MongoDB ne dispose pas d'un système de retour en arrière intégré pour updateMany. Testez toujours sur un site de démonstration et sauvegardez d'abord les données de production.


Nic Raboy's photo
Author
Nic Raboy

Nic Raboy est responsable des relations avec les développeurs chez MongoDB, où il dirige une équipe de développeurs Python, Java, C# et PHP qui créent un contenu génial pour aider les développeurs à réussir à inclure MongoDB dans leurs projets. Il a de l'expérience avec Golang et JavaScript et écrit souvent sur ses aventures de développement.

Sujets

Apprenez-en plus sur MongoDB et les bases de données avec ces cours !

Cours

Introduction to Databases in Python

4 h
99.6K
In this course, you'll learn the basics of relational databases and how to interact with them.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow
Apparenté

blog

Architecture de l'entrepôt de données : Tendances, outils et techniques

Apprenez l'essentiel de l'architecture d'un entrepôt de données, des composants clés aux meilleures pratiques, pour construire un système de données évolutif et efficace !
Kurtis Pykes 's photo

Kurtis Pykes

15 min

blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates a offert plus de 20k bourses d'études à nos partenaires à but non lucratif au deuxième trimestre 2023. Découvrez comment des apprenants défavorisés et assidus ont transformé ces opportunités en réussites professionnelles qui ont changé leur vie.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

blog

Les 50 meilleures questions et réponses d'entretien sur AWS pour 2025

Un guide complet pour explorer les questions d'entretien AWS de base, intermédiaires et avancées, ainsi que des questions basées sur des situations réelles.
Zoumana Keita 's photo

Zoumana Keita

15 min

blog

Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Vous êtes actuellement à la recherche d'un emploi qui utilise Snowflake ? Préparez-vous à répondre à ces 20 questions d'entretien sur le flocon de neige pour décrocher le poste !
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 min

blog

2022-2023 Rapport annuel DataCamp Classrooms

À l'aube de la nouvelle année scolaire, DataCamp Classrooms est plus motivé que jamais pour démocratiser l'apprentissage des données, avec plus de 7 650 nouveaux Classrooms ajoutés au cours des 12 derniers mois.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 min

blog

Nous avons fait don de bourses DataCamp Premium à un million de personnes, et ce n'est pas fini.

Réparties entre nos deux programmes d'impact social, DataCamp Classrooms et #DCDonates, les bourses offrent un accès illimité à tout ce que DataCamp Premium a à offrir.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Voir plusVoir plus