Aller au contenu

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.

show dbs
use boutique // sélectionne la base ; elle sera créée à la première écriture
db // base courante
db.getName();
db.stats();
db.dropDatabase(); // supprime la base courante et tout son contenu

Une base n’existe réellement qu’une fois qu’elle contient au moins une collection avec des données.

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'] } },
});
show collections
db.getCollectionNames();
db.getCollectionInfos({ name: 'clients_valides' });
db.clients.countDocuments();
db.clients.estimatedDocumentCount(); // estimation rapide
db.clients.stats().size; // taille des données en octets
db.clients.findOne();
db.clients_valides.renameCollection('clients_controles');
db.clients_controles.drop();
db.createCollection('essai');
db.essai.drop();

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

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'ObjectId
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 lignes
db.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.

  • Des noms de collections au pluriel, en minuscules, sans espaces (clients, commandes).
  • Une validation par schéma pour les collections critiques.
  • NumberDecimal pour 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.