Lier des documents MongoDB

MongoDBBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les bases de l'établissement de relations entre les documents dans MongoDB. Cette technique, connue sous le nom de référencement (referencing), est essentielle pour construire des structures de base de données complexes et organisées. Vous pratiquerez la création de collections, l'insertion de documents avec des références à d'autres documents, la récupération et la combinaison de données connexes à l'aide de l'étape d'agrégation $lookup, et la gestion du cycle de vie de ces documents liés. À la fin de ce laboratoire, vous aurez une solide compréhension de la manière de modéliser et de gérer les relations un-à-plusieurs (one-to-many) dans votre base de données MongoDB.

Établir des relations entre documents

Dans cette première étape, vous allez créer deux collections distinctes et établir une relation entre elles. Nous allons modéliser un scénario courant : une base de données de bibliothèque avec des auteurs (authors) et des livres (books). Chaque livre référencera son auteur.

Tout d'abord, ouvrez le MongoDB Shell. Cette interface interactive en ligne de commande vous permet d'interagir avec votre instance MongoDB.

mongosh

Une fois dans le shell, vous verrez une invite test>. Passons à une nouvelle base de données nommée library_database. Si la base de données n'existe pas, MongoDB la créera pour vous lorsque vous stockerez des données pour la première fois.

use library_database

Maintenant, créons la collection authors en insérant deux documents. Chaque document possède un _id unique de type ObjectId, que nous utiliserons pour le référencement.

db.authors.insertMany([
  {
    _id: ObjectId("660a1f5c9b8f8b1234567890"),
    name: "Jane Austen",
    nationality: "British"
  },
  {
    _id: ObjectId("660a1f5c9b8f8b1234567891"),
    name: "George Orwell",
    nationality: "British"
  }
]);

Vous devriez voir une confirmation que les documents ont été insérés avec succès.

Exemple de sortie :

{
  "acknowledged": true,
  "insertedIds": {
    "0": ObjectId("660a1f5c9b8f8b1234567890"),
    "1": ObjectId("660a1f5c9b8f8b1234567891")
  }
}

Ensuite, créez la collection books. Dans chaque document de livre, le champ author_id stockera l'ObjectId de l'auteur correspondant de la collection authors. Cela crée le lien entre un livre et son auteur.

db.books.insertMany([
  {
    title: "Pride and Prejudice",
    author_id: ObjectId("660a1f5c9b8f8b1234567890"),
    year: 1813
  },
  {
    title: "1984",
    author_id: ObjectId("660a1f5c9b8f8b1234567891"),
    year: 1949
  }
]);

Exemple de sortie :

{
  "acknowledged": true,
  "insertedIds": {
    "0": ObjectId("660b2a1c9b8f8b1234567892"),
    "1": ObjectId("660b2a1c9b8f8b1234567893")
  }
}

Vous avez maintenant créé avec succès deux collections et lié des documents de la collection books à des documents de la collection authors. Gardez le shell MongoDB ouvert pour la prochaine étape.

Interroger des documents liés

Maintenant que vous avez établi les relations, l'étape logique suivante consiste à récupérer les données liées en une seule requête. Le framework d'agrégation de MongoDB fournit l'étape $lookup à cet effet, qui effectue une jointure externe gauche (left outer join) avec une autre collection.

Assurez-vous d'être toujours dans le shell mongosh et d'utiliser la library_database.

Effectuons une requête pour récupérer tous les livres et intégrer les informations de leurs auteurs correspondants dans les résultats.

db.books.aggregate([
  {
    $lookup: {
      from: "authors",
      localField: "author_id",
      foreignField: "_id",
      as: "author_details"
    }
  }
]);

L'étape $lookup joint la collection books à la collection authors. Examinons ses paramètres :

  • from: "authors" : Spécifie la collection avec laquelle effectuer la jointure.
  • localField: "author_id" : Spécifie le champ des documents d'entrée (de la collection books).
  • foreignField: "_id" : Spécifie le champ des documents de la collection "from" (la collection authors).
  • as: "author_details" : Spécifie le nom du nouveau champ tableau à ajouter à la sortie. Ce tableau contiendra les documents d'auteur correspondants.

Exemple de sortie pour l'un des documents :

[
  {
    "_id": ObjectId("..."),
    "title": "Pride and Prejudice",
    "author_id": ObjectId("660a1f5c9b8f8b1234567890"),
    "year": 1813,
    "author_details": [
      {
        "_id": ObjectId("660a1f5c9b8f8b1234567890"),
        "name": "Jane Austen",
        "nationality": "British"
      }
    ]
  },
  ...
]

Comme vous pouvez le constater, le champ author_details est un tableau contenant le document complet de l'auteur. Cette fonctionnalité puissante vous permet de récupérer des données complètes sans avoir à effectuer plusieurs requêtes depuis votre application.

Mettre à jour des documents liés

Les données dans une base de données sont rarement statiques. Dans cette étape, vous apprendrez comment mettre à jour des documents dans les collections authors et books. Parce que nous utilisons des références, vous pouvez mettre à jour les informations d'un auteur en un seul endroit, et toutes les requêtes qui se joignent à cet auteur refléteront automatiquement le changement.

Ajoutons une année de naissance au document de Jane Austen. Nous utiliserons la méthode updateOne avec l'opérateur $set pour ajouter un nouveau champ sans écraser le document entier.

db.authors.updateOne(
  { name: "Jane Austen" },
  {
    $set: {
      birth_year: 1775
    }
  }
);

Exemple de sortie :

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

Maintenant, mettons à jour les détails d'un livre. Nous ajouterons un genre à "Pride and Prejudice".

db.books.updateOne(
  { title: "Pride and Prejudice" },
  {
    $set: {
      genre: "Romance"
    }
  }
);

Pour vérifier que les deux mises à jour ont réussi, vous pouvez interroger directement les documents.

Vérifiez d'abord l'auteur :

db.authors.findOne({ name: "Jane Austen" });

Ensuite, vérifiez le livre :

db.books.findOne({ title: "Pride and Prejudice" });

Vous verrez les nouveaux champs birth_year et genre dans les documents respectifs. La référence author_id dans le document du livre reste inchangée, préservant ainsi le lien.

Gérer et supprimer les liens de documents

La dernière partie de la gestion des relations concerne la gestion des suppressions. Lorsque vous supprimez un document, vous devez considérer ce qui arrive aux documents qui y font référence. MongoDB n'applique pas automatiquement l'intégrité référentielle, c'est donc une tâche que vous devez gérer au niveau de l'application.

Tout d'abord, supprimons un livre tout en conservant son auteur. Nous allons supprimer le livre "1984".

db.books.deleteOne({ title: "1984" });

Exemple de sortie :

{ "acknowledged": true, "deletedCount": 1 }

Si vous interrogez maintenant la collection books, vous verrez qu'il ne reste qu'un seul livre. Le document "George Orwell" dans la collection authors n'est pas affecté.

Considérons maintenant un scénario plus complexe : supprimer un auteur et tous ses livres associés. Cela nécessite un processus en plusieurs étapes pour maintenir l'intégrité des données.

Tout d'abord, trouvez l'ID de l'auteur et stockez-le dans une variable. Nous allons supprimer "Jane Austen".

const authorId = db.authors.findOne({ name: "Jane Austen" })._id;

Ensuite, utilisez cet ID pour supprimer tous les livres associés à cet auteur. La commande deleteMany est utilisée au cas où un auteur aurait plusieurs livres.

db.books.deleteMany({ author_id: authorId });

Enfin, supprimez le document de l'auteur lui-même.

db.authors.deleteOne({ _id: authorId });

Ce processus manuel en plusieurs étapes garantit que vous ne laissez pas de documents de livres "orphelins" avec des références author_id invalides. Vous pouvez vérifier que le livre "Pride and Prejudice" et l'auteur "Jane Austen" ont tous deux été supprimés de leurs collections respectives.

Vous pouvez maintenant quitter le shell MongoDB.

exit

Résumé

Dans ce laboratoire, vous avez appris les techniques essentielles pour travailler avec des documents liés dans MongoDB. Vous avez commencé par créer les collections authors et books et établi une relation un-à-plusieurs en utilisant des références de documents. Vous avez ensuite pratiqué la récupération et la combinaison de données à partir de ces collections liées en utilisant l'étape d'agrégation $lookup. De plus, vous avez appris à mettre à jour des documents individuels sans casser leurs liens et, enfin, comment gérer correctement les suppressions pour maintenir l'intégrité des données en supprimant les documents liés dans un processus contrôlé en plusieurs étapes. Ces compétences constituent une base solide pour concevoir et construire des applications de base de données NoSQL plus sophistiquées et interconnectées.