MongoDB : bases et collections
MongoDB organise les données en bases, collections (équivalent des tables) et documents (équivalent des lignes, au format JSON). Les exemples construisent la base boutique, réutilisée dans les pages suivantes.
Bases de données
Section intitulée « Bases de données »show dbsuse boutique // sélectionne la base ; elle sera créée à la première écrituredb // base courantedb.getName();db.stats();db.dropDatabase(); // supprime la base courante et tout son contenuUne base n’existe réellement qu’une fois qu’elle contient au moins une collection avec des données.
Créer une collection
Section intitulée « Créer une collection »Une collection est créée automatiquement à la première insertion :
db.clients.insertOne({ nom: 'Alice Martin' });Ou explicitement, avec des règles de validation :
db.createCollection('clients_valides', { validator: { $jsonSchema: { bsonType: 'object', required: ['nom', 'email'], properties: { nom: { bsonType: 'string' }, email: { bsonType: 'string', pattern: '^.+@.+$' }, ville: { bsonType: 'string' }, age: { bsonType: 'int', minimum: 0 }, }, }, }, validationLevel: 'strict', validationAction: 'error',});Un document qui ne respecte pas le schéma est refusé (validationAction: "error") ou accepté avec un avertissement ("warn"). Modifier les règles d’une collection existante :
db.runCommand({ collMod: 'clients_valides', validator: { $jsonSchema: { bsonType: 'object', required: ['nom'] } },});Inspecter
Section intitulée « Inspecter »show collectionsdb.getCollectionNames();db.getCollectionInfos({ name: 'clients_valides' });db.clients.countDocuments();db.clients.estimatedDocumentCount(); // estimation rapidedb.clients.stats().size; // taille des données en octetsdb.clients.findOne();Renommer et supprimer
Section intitulée « Renommer et supprimer »db.clients_valides.renameCollection('clients_controles');db.clients_controles.drop();db.createCollection('essai');db.essai.drop();Types de données BSON
Section intitulée « Types de données BSON »MongoDB stocke les documents en BSON, une extension binaire de JSON :
| Type | Exemple en mongosh |
Remarque |
|---|---|---|
| Chaîne | "Alice" |
Texte UTF-8 |
| Entier | NumberInt(42), NumberLong(9007199254740993) |
Nombres sans décimale (les nombres JavaScript sont enregistrés en double par défaut) |
| Décimal exact | NumberDecimal("19.99") |
Pour les montants |
| Booléen | true, false |
|
| Date | new Date(), ISODate("2026-10-05T14:30:00Z") |
Instant en UTC |
ObjectId |
ObjectId() |
Identifiant de 12 octets généré automatiquement |
| Tableau | ["web", "mobile"] |
|
| Document imbriqué | { rue: "1 rue X", ville: "Lyon" } |
|
null |
null |
Le champ _id
Section intitulée « Le champ _id »Chaque document possède un champ _id unique, de type ObjectId par défaut (généré à l’insertion). Il peut être fourni :
db.pays.insertOne({ _id: 'FR', nom: 'France' });db.clients.findOne({}, { _id: 1 });ObjectId('65f0c0ffee0000000000abcd').getTimestamp(); // date de création contenue dans l'ObjectIdModéliser : imbriquer ou référencer
Section intitulée « Modéliser : imbriquer ou référencer »| Choix | Quand |
|---|---|
| Imbriquer (documents ou tableaux dans le document) | Données lues ensemble, petite taille, relation « un à peu » (adresse d’un client) |
Référencer (stocker l’_id d’un autre document) |
Données volumineuses ou partagées, relation « un à beaucoup » (commandes d’un client) |
// Imbriqué : une commande contient ses lignesdb.commandes.insertOne({ client_id: ObjectId('65f0c0ffee0000000000abcd'), statut: 'payee', lignes: [ { produit: 'Clavier', quantite: 1, prix: 49.9 }, { produit: 'Souris', quantite: 2, prix: 15.5 }, ], passee_le: new Date(),});Un document est limité à 16 Mo : éviter les tableaux qui croissent sans limite.
Bonnes pratiques
Section intitulée « Bonnes pratiques »- Des noms de collections au pluriel, en minuscules, sans espaces (
clients,commandes). - Une validation par schéma pour les collections critiques.
NumberDecimalpour les montants, jamais de nombres flottants.- Stocker les dates en type
Date(pas en texte). - Penser aux requêtes d’abord : le schéma se conçoit selon les lectures les plus fréquentes.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Data Modeling et Schema Validation
- Suite : Requêtes et agrégation