Cours
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
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 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.