Mettre à jour des enregistrements MongoDB

MongoDBBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à mettre à jour des documents dans une collection MongoDB. Vous commencerez par modifier un seul document à l'aide de la méthode updateOne(). Ensuite, vous apprendrez à modifier plusieurs documents à la fois avec la méthode updateMany(). Vous travaillerez également avec divers opérateurs de mise à jour tels que $set, $inc et $unset pour effectuer des modifications spécifiques. Enfin, vous explorerez l'option upsert, qui vous permet de mettre à jour un document existant ou d'en créer un nouveau s'il n'existe pas. Ce laboratoire offre une approche pratique et concrète pour maîtriser les compétences fondamentales de manipulation de données dans MongoDB.

Mise à jour d'un document unique avec updateOne

Dans cette étape, vous apprendrez à modifier un seul document dans une collection MongoDB. Nous utiliserons la méthode updateOne() avec l'opérateur $set pour modifier la valeur d'un champ dans un document spécifique.

Tout d'abord, ouvrez le Shell MongoDB pour interagir avec votre base de données.

mongosh

Une fois dans le shell, basculez vers la base de données mylab_database qui a été préparée pour vous.

use mylab_database

Visualisons les documents actuels dans la collection books. La méthode .pretty() formate la sortie pour la rendre plus lisible.

db.books.find().pretty();

Vous devriez voir les trois documents de livres initiaux. Les valeurs _id seront uniques dans votre environnement.

[
  {
    _id: ObjectId("..."),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

Maintenant, mettons à jour l'année de publication du livre "JavaScript Fundamentals" à 2023.

db.books.updateOne(
  { title: "JavaScript Fundamentals" },
  { $set: { year: 2023 } }
);

Décomposons cette commande :

  • updateOne() : Cette méthode trouve le premier document qui correspond au filtre et le met à jour.
  • { title: "JavaScript Fundamentals" } : C'est le document de filtre. Il indique à MongoDB de trouver un document où le champ title est "JavaScript Fundamentals".
  • { $set: { year: 2023 } } : C'est le document de mise à jour. L'opérateur $set remplace la valeur du champ year par 2023.

La commande renvoie un objet de résultat qui confirme l'opération.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

matchedCount: 1 indique qu'un document correspondait à notre filtre, et modifiedCount: 1 indique qu'un document a été mis à jour avec succès.

Pour vérifier la modification, recherchez à nouveau le document.

db.books.findOne({ title: "JavaScript Fundamentals" });

La sortie affichera le document mis à jour avec la nouvelle année.

{
  _id: ObjectId("..."),
  title: 'JavaScript Fundamentals',
  author: 'Mike Johnson',
  year: 2023,
  pages: 350
}

Mise à jour de plusieurs documents avec updateMany

Parfois, vous devez mettre à jour plusieurs documents à la fois. Pour cela, MongoDB fournit la méthode updateMany(). Dans cette étape, vous ajouterez un nouveau champ à tous les livres publiés avant une certaine année.

Ajoutons un champ status avec la valeur "Classic" à tous les livres publiés avant 2022.

db.books.updateMany({ year: { $lt: 2022 } }, { $set: { status: "Classic" } });

Voici une explication de la commande :

  • updateMany() : Cette méthode met à jour tous les documents qui correspondent au filtre spécifié.
  • { year: { $lt: 2022 } } : Ce filtre sélectionne les documents dont l'année (year) est inférieure à 2022. L'opérateur $lt signifie "less than" (inférieur à).
  • { $set: { status: "Classic" } } : Ce document de mise à jour ajoute un nouveau champ status avec la valeur "Classic" à tous les documents correspondants.

La sortie indiquera combien de documents ont été trouvés et modifiés. Dans notre cas, deux livres ont été publiés avant 2022.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 2,
  "modifiedCount": 2,
  "upsertedCount": 0
}

Pour vérifier que les deux documents ont été mis à jour, vous pouvez interroger tous les livres ayant le statut "Classic".

db.books.find({ status: "Classic" }).pretty();

Vous verrez les deux livres qui incluent maintenant le champ status.

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450,
    status: 'Classic'
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99,
    status: 'Classic'
  }
]

Utilisation d'autres opérateurs de mise à jour : $inc et $unset

MongoDB offre une variété d'opérateurs pour différents types de mises à jour. Dans cette étape, vous apprendrez à utiliser $inc pour modifier des valeurs numériques et $unset pour supprimer des champs d'un document.

Tout d'abord, utilisons l'opérateur $inc pour augmenter le nombre de pages du livre "Python Deep Dive" de 50. L'opérateur $inc incrémente un champ d'une valeur spécifiée.

db.books.updateOne({ title: "Python Deep Dive" }, { $inc: { pages: 50 } });

Pour confirmer la modification, récupérez le document.

db.books.findOne({ title: "Python Deep Dive" });

Le champ pages devrait maintenant être 500 (450 + 50).

{
  _id: ObjectId("..."),
  title: 'Python Deep Dive',
  author: 'Sarah Williams',
  year: 2021,
  pages: 500,
  status: 'Classic'
}

Ensuite, supprimons le champ price du document "Machine Learning Basics". L'opérateur $unset supprime un champ particulier. La valeur fournie à $unset (dans ce cas, "") n'a pas d'importance et peut être n'importe quelle valeur.

db.books.updateOne(
  { title: "Machine Learning Basics" },
  { $unset: { price: "" } }
);

Vérifions que le champ price a été supprimé.

db.books.findOne({ title: "Machine Learning Basics" });

La sortie affichera le document sans le champ price.

{
  _id: ObjectId("..."),
  title: 'Machine Learning Basics',
  author: 'John Doe',
  year: 2020,
  status: 'Classic'
}

Création de documents avec upsert

Un "upsert" est un type spécial d'opération de mise à jour qui met à jour un document s'il existe, ou en insère un nouveau s'il n'existe pas. Ceci est utile pour éviter une logique séparée de "vérifier puis insérer" et assure l'atomicité des opérations de base de données. Les upserts sont particulièrement précieux dans les scénarios où vous souhaitez :

  • Assurer la cohérence des données : Au lieu de vérifier d'abord si un document existe, puis de décider s'il faut insérer ou mettre à jour, vous pouvez effectuer une seule opération qui gère les deux cas de manière atomique.
  • Gérer les opérations concurrentes : Dans les environnements multi-utilisateurs, un upsert empêche les conditions de concurrence (race conditions) où un autre processus pourrait insérer le même document entre vos opérations de vérification et d'insertion.
  • Simplifier la logique applicative : Réduit le besoin d'une logique conditionnelle complexe dans le code de votre application, la rendant plus maintenable et moins sujette aux erreurs.

Vous pouvez activer ce comportement en ajoutant l'option upsert: true à votre commande de mise à jour.

Essayons d'ajouter un nouveau livre, "Cloud Computing Essentials". Puisque ce livre n'existe pas dans notre collection, l'opération upsert va le créer.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

La commande se compose de trois parties :

  1. Le filtre : { title: "Cloud Computing Essentials" }
  2. La mise à jour : { $set: { ... } }
  3. Les options : { upsert: true }

Comme aucun document ne correspondait au filtre, un nouveau document a été créé. L'objet résultat le reflète en incluant un upsertedId.

{
  acknowledged: true,
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1,
  upsertedId: ObjectId("...")
}

Maintenant, exécutons à nouveau la même commande. Cette fois, MongoDB trouvera le document que nous venons de créer et le mettra à jour.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

Le résultat affiche maintenant matchedCount: 1. Comme les données que nous définissons sont identiques aux données existantes, modifiedCount est 0. Si nous avions modifié une valeur, modifiedCount serait 1.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 0,
  "upsertedCount": 0
}

Vous pouvez vérifier que le nouveau livre existe dans la collection.

db.books.findOne({ title: "Cloud Computing Essentials" });

Le résultat affichera le document nouvellement créé.

{
  _id: ObjectId("..."),
  title: 'Cloud Computing Essentials',
  author: 'David Lee',
  year: 2023,
  pages: 300
}

Lorsque vous avez terminé, vous pouvez quitter le Shell MongoDB.

exit;

Résumé

Dans ce laboratoire, vous avez appris les techniques essentielles pour mettre à jour des documents dans MongoDB. Vous avez pratiqué la modification de documents uniques avec updateOne et de plusieurs documents avec updateMany. Vous avez également exploré de puissants opérateurs de mise à jour, notamment $set pour modifier les valeurs des champs, $inc pour incrémenter les nombres et $unset pour supprimer des champs. Enfin, vous avez appris à utiliser l'option upsert pour créer un document s'il n'existe pas déjà. Ces compétences sont fondamentales pour gérer et maintenir des données dans toute application MongoDB.