Insérer des données dans MongoDB

MongoDBBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les techniques fondamentales pour insérer des données dans une base de données MongoDB. Vous pratiquerez l'insertion de documents uniques et multiples, la gestion des erreurs potentielles et la vérification de l'intégrité des données à l'aide du shell MongoDB (mongosh).

Ce laboratoire se concentre sur l'opération "Create" (Créer) dans le cadre de CRUD (Create, Read, Update, Delete). Vous construirez une simple base de données de librairie à partir de zéro, acquérant ainsi une expérience pratique des tâches essentielles de gestion de données dans un environnement NoSQL. À la fin, vous aurez une solide compréhension de la manière d'ajouter et de gérer efficacement les données dans MongoDB.

Insérer un document unique

Dans cette première étape, vous allez vous connecter au serveur MongoDB, créer une base de données et une collection, puis insérer votre premier document. MongoDB stocke les données dans des documents flexibles, similaires à JSON, ce qui facilite la représentation de structures de données complexes.

Tout d'abord, connectez-vous à votre instance MongoDB locale à l'aide du shell MongoDB. Ouvrez votre terminal et exécutez la commande suivante :

mongosh

Vous verrez une invite > indiquant que vous êtes maintenant dans le shell MongoDB et connecté à la base de données.

Ensuite, basculez vers une nouvelle base de données nommée bookstore. Si la base de données n'existe pas, MongoDB la créera pour vous lorsque vous y stockerez des données pour la première fois.

use bookstore

La sortie confirmera que vous avez basculé vers la base de données bookstore.

switched to db bookstore

Maintenant, insérez un document unique dans une nouvelle collection appelée books. Une collection est un groupe de documents MongoDB, à peu près équivalent à une table dans une base de données relationnelle. La méthode insertOne() ajoute un seul document à la collection.

db.books.insertOne({
  title: "The Great Gatsby",
  author: "F. Scott Fitzgerald",
  year: 1925,
  genres: ["Classic", "Fiction"],
  stock: 10
});

Après une insertion réussie, MongoDB renvoie un document confirmant l'opération et fournissant l'_id unique du document nouvellement inséré.

{
  acknowledged: true,
  insertedId: ObjectId("652f8d3e111a2b3c4d5e6f78")
}

L'_id est un identifiant unique généré automatiquement par MongoDB pour chaque document, garantissant que chaque document d'une collection peut être identifié de manière unique.

Insérer plusieurs documents

Insérer des documents un par un peut être inefficace. Pour ajouter plusieurs documents à la fois, MongoDB fournit la méthode insertMany(). Ceci est connu comme une opération d'insertion en masse (bulk insert), ce qui réduit le nombre d'allers-retours réseau vers la base de données.

Dans cette étape, vous ajouterez trois livres supplémentaires à votre collection books en une seule commande. Assurez-vous d'être toujours dans le shell mongosh et d'avoir basculé vers la base de données bookstore.

Utilisez la méthode insertMany(), en passant un tableau d'objets documents.

db.books.insertMany([
  {
    title: "1984",
    author: "George Orwell",
    year: 1949,
    genres: ["Dystopian", "Science Fiction"],
    stock: 15
  },
  {
    title: "To Kill a Mockingbird",
    author: "Harper Lee",
    year: 1960,
    genres: ["Classic", "Fiction"],
    stock: 5
  },
  {
    title: "Pride and Prejudice",
    author: "Jane Austen",
    year: 1813,
    genres: ["Romance", "Classic"],
    stock: 12
  }
]);

La sortie confirmera que l'opération a été reconnue (acknowledged) et listera les valeurs _id pour chacun des trois documents que vous avez insérés.

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("652f8e3e111a2b3c4d5e6f79"),
    '1': ObjectId("652f8e3e111a2b3c4d5e6f7a"),
    '2': ObjectId("652f8e3e111a2b3c4d5e6f7b")
  }
}

Pour vérifier que les documents ont été ajoutés, vous pouvez compter le nombre total de documents dans la collection.

db.books.countDocuments();

Le résultat devrait être 4, représentant le document de l'étape précédente et les trois que vous venez d'ajouter.

4

Interroger et vérifier les données insérées

Après avoir inséré des données, l'étape logique suivante consiste à les récupérer et à les examiner. Ceci est crucial pour vérifier que vos données ont été correctement stockées et pour construire des applications qui lisent à partir de la base de données. MongoDB fournit la méthode puissante find() à cet effet.

Pour récupérer tous les documents de la collection books, utilisez la méthode find() sans aucun argument.

db.books.find();

Cette commande listera les quatre documents actuellement dans votre collection. La sortie peut être longue, mais c'est un bon moyen de tout voir d'un coup.

Plus souvent, vous voudrez trouver des documents qui correspondent à des critères spécifiques. Pour trouver tous les livres publiés avant 1950, vous pouvez utiliser un filtre de requête avec l'opérateur $lt (less than - inférieur à).

db.books.find({ year: { $lt: 1950 } });

Cette requête renverra les documents pour "The Great Gatsby", "1984" et "Pride and Prejudice".

Parfois, vous n'avez besoin que de champs spécifiques des documents, pas du document entier. C'est ce qu'on appelle la projection. Pour récupérer uniquement le title (titre) et l'author (auteur) de tous les livres du genre "Classic", vous pouvez ajouter un document de projection comme deuxième argument à find().

db.books.find({ genres: "Classic" }, { title: 1, author: 1, _id: 0 });

Dans le document de projection, 1 signifie "inclure ce champ" et 0 signifie "exclure ce champ". Par défaut, le champ _id est toujours inclus, nous l'excluons donc explicitement avec _id: 0.

La sortie sera une liste propre de titres et d'auteurs :

[
  { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
  { "title": "To Kill a Mockingbird", "author": "Harper Lee" },
  { "title": "Pride and Prejudice", "author": "Jane Austen" }
]

Gérer les erreurs d'insertion avec un index unique

L'intégrité des données est essentielle pour toute base de données. Une façon de l'imposer est d'empêcher les entrées en double. Dans cette étape, vous apprendrez comment créer un index unique et observer comment MongoDB gère les tentatives de violation de cette contrainte.

Assurons-nous que deux livres de notre collection ne puissent pas avoir le même titre. Pour ce faire, créez un index unique sur le champ title.

db.books.createIndex({ title: 1 }, { unique: true });

La sortie confirme le nom de l'index qui a été créé.

title_1

Maintenant que l'index unique est en place, essayons d'insérer un document avec un titre qui existe déjà dans la collection, comme "1984".

db.books.insertOne({
  title: "1984",
  author: "George Orwell",
  year: 1949,
  genres: ["Dystopian", "Science Fiction"],
  stock: 20
});

Cette opération échouera. MongoDB lèvera une MongoBulkWriteException avec le code d'erreur E11000, qui indique une violation de clé dupliquée (duplicate key violation). C'est le comportement attendu et cela confirme que notre index unique fonctionne correctement.

MongoBulkWriteException: E11000 duplicate key error collection: bookstore.books index: title_1 dup key: { title: "1984" }

Dans une application, vous encapsuleriez de telles opérations de base de données dans un bloc try...catch pour gérer ces erreurs gracieusement au lieu de faire planter le programme. Vous pouvez également simuler cela dans le shell mongosh.

try {
  db.books.insertOne({
    title: "1984",
    author: "George Orwell"
  });
} catch (e) {
  print("Error inserting document:", e.message);
}

Cette commande interceptera l'exception et affichera un message d'erreur convivial, démontrant une manière robuste de gérer les échecs d'insertion potentiels.

Appliquer l'intégrité des données avec la validation de schéma

Bien que MongoDB soit connu pour son schéma flexible, vous pouvez imposer une structure spécifique pour vos documents à l'aide de la validation de schéma. Cela garantit que tous les documents d'une collection respectent un ensemble de règles défini, améliorant ainsi la qualité et la cohérence des données.

Dans cette dernière étape, vous ajouterez un validateur à la collection books. Ce validateur exigera que chaque document possède un title, un author et une year, et il imposera des types de données et des plages spécifiques pour ces champs.

Utilisez la commande collMod (modifier la collection) pour ajouter le validateur.

db.runCommand({
  collMod: "books",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["title", "author", "year"],
      properties: {
        title: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        author: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        year: {
          bsonType: "int",
          minimum: 1000,
          maximum: 2024,
          description: "must be an integer between 1000 and 2024"
        }
      }
    }
  }
});

La sortie { ok: 1 } confirme que le validateur a été appliqué avec succès.

Maintenant, testons le validateur en tentant d'insérer un document qui enfreint les règles. Ce document a une year qui est en dehors de la plage autorisée.

db.books.insertOne({
  title: "The Hobbit",
  author: "J.R.R. Tolkien",
  year: 999
});

L'insertion échouera, et MongoDB renverra un message d'erreur expliquant que le document n'a pas passé la validation.

MongoBulkWriteException: Document failed validation

Cela confirme que votre règle de validation de schéma est active et protège efficacement l'intégrité de vos données. Cette fonctionnalité puissante combine la flexibilité d'une base de données NoSQL avec la fiabilité de la validation des données.

Résumé

Dans ce laboratoire, vous avez appris avec succès les techniques de base pour insérer des données dans une collection MongoDB. Vous avez commencé par insérer un seul document avec insertOne() puis ajouté efficacement plusieurs documents en utilisant l'opération groupée insertMany().

Vous vous êtes également exercé à interroger et vérifier vos données à l'aide de find() et countDocuments(). Plus important encore, vous avez exploré deux méthodes clés pour garantir l'intégrité des données : la création d'un index unique pour prévenir les doublons et la mise en œuvre de la validation de schéma pour imposer une structure de document cohérente. Ces compétences sont fondamentales pour construire des applications robustes et fiables avec MongoDB.