Résumé MONGODB:
📚 1. Introduction à NoSQL et MongoDB:
NoSQL = Not Only SQL : bases conçues pour les données massives, non structurées ou semi-structurées.
Bases de donnees documentaires (Document Stores), exemple : MongoDB.
Bases de donnees
Cle-Valeur (Key-Value Stores), exemple : Redis.
Bases de donnees
en colonnes (Wide-Column Stores), exemple Cassandra.
📦 1.
CRUD – Requêtes de base
➕ CREATE:
// Insérer un document
db.utilisateurs.insertOne({
nom: "Alice",
email: "[email protected]",
age: 30
})
// Insérer plusieurs documents
db.utilisateurs.insertMany([
{ nom: "Bob", email: "
[email protected]", age: 25 },
{ nom: "Charlie", email: "
[email protected]", age: 28 }
])
🔍 READ:
// Trouver un document
db.utilisateurs.findOne({ nom: "Alice" })
// Trouver tous les documents
db.utilisateurs.find()
// Condition (âge > 25)
db.utilisateurs.find({ age: { $gt: 25 } })
Résumé MONGODB: 1
// Projection : n'afficher que nom et email
db.utilisateurs.find({ age: { $gt: 25 } }, { nom: 1, email: 1, _id: 0 })
✏️ UPDATE:
// Modifier un champ
db.utilisateurs.updateOne(
{ nom: "Alice" },
{ $set: { age: 31 } }
)
// Modifier plusieurs documents
db.utilisateurs.updateMany(
{ age: { $lt: 30 } },
{ $set: { statut: "jeune" } }
)
// Incrémenter
db.utilisateurs.updateOne(
{ nom: "Alice" },
{ $inc: { age: 1 } }
)
// Ajouter dans un tableau
db.utilisateurs.updateOne(
{ nom: "Alice" },
{ $push: { hobbies: "lecture" } }
)
Opérateurs utiles :
$set : Modifie un champ.
$inc : Incrémente (ex. : { $inc: { "age": 1 } }).
$push : Ajoute un élément à un tableau.
❌ DELETE:
// Supprimer un document
db.utilisateurs.deleteOne({ nom: "Alice" })
// Supprimer plusieurs
db.utilisateurs.deleteMany({ age: { $lt: 25 } })
// Supprimer tous
db.utilisateurs.deleteMany({})
📊 2. Indexation
-Les index améliorent les performances des requêtes, surtout sur de grandes collections.
// Index sur un champ
db.utilisateurs.createIndex({ email: 1 })
// Index sur un champ d’un sous-document
db.utilisateurs.createIndex({ "adresse.ville": 1 })
Résumé MONGODB: 2
// Index composé
db.utilisateurs.createIndex({ nom: 1, email: 1 })
// Index texte
db.produits.createIndex({ description: "text" })
// Index géospatial
db.restaurants.createIndex({ location: "2dsphere" })
// Voir les index
db.utilisateurs.getIndexes()
// Supprimer un index
db.utilisateurs.dropIndex("nomIndex")
🧠 3 Agrégation
L’agrégation permet de traiter et transformer les données (équivalent des GROUP BY en SQL).
-$match : Filtre les documents (comme find).
{ $match: { "city": "Paris" } }
db.users.aggregate([
{ $match: { "country": "France" } },
{ $group: { _id: "$city", totalAge: { $sum: "$age" } } }, #$group : Regroupe les documents par un champ et a
pplique des calculs (ex. : somme, moyenne)
{ $sort: { totalAge: -1 } }, #$sort : Trie les résultats.
{ $project: { city: "$_id", totalAge: 1, _id: 0 } } #$project : Sélectionne ou reformate les champs.
])
// $lookup (jointure)
db.utilisateurs.aggregate([
{
$lookup: {
from: "commandes",
localField: "commandes",
foreignField: "_id",
as: "details_commandes"
}
}
])
🔁 5. Sharding
But : répartir les données sur plusieurs serveurs (Action : Mémorise la séquence : Activer sharding → Créer
index → Sharder collection.)
Composants :
mongos (routeur)
config servers
shard
// Activer le sharding
Résumé MONGODB: 3
sh.enableSharding("myDatabase")
// Créer un index haché
db.myCollection.createIndex({ email: "hashed" })
// Appliquer le sharding
sh.shardCollection("myDatabase.myCollection", { email: "hashed" })
Vérifier le statut du sharding :
sh.status()
🛡️ 6. Réplication (Replica Set)
La réplication dans MongoDB consiste à maintenir plusieurs copies des données sur différents serveurs
(nœuds) pour assurer haute disponibilité, tolérance aux pannes, et redondance. Elle est implémentée via des
Replica Sets.
Composants : Primary, Secondaries, Arbitre (optionnel)
1-Démarrer les nœuds MongoDB :
mongod --replSet "rs0" --port 27017 --dbpath /data/db1
mongod --replSet "rs0" --port 27018 --dbpath /data/db2
mongod --replSet "rs0" --port 27019 --dbpath /data/db3
// Initialiser un Replica Set
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
})
// Vérifier l’état du Replica Set
rs.status()
// Lecture depuis un secondaire
db.utilisateurs.find().readPref("secondary")
// Ajouter un arbitre
rs.addArb("localhost:27020")
🔒 8. Transactions :
Une transaction permet d’ex´ecuter plusieurs op´erations de maniere atomique, en respectant le principe ACID :
Atomicite, Coherence, Isolation, et Durabilite.
✅ 1. Atomicité
Exemple : Transférer 200 MAD de Alice à Bob (tout ou rien) :
js
CopierModifier
const session = db.getMongo().startSession()
session.startTransaction()
Résumé MONGODB: 4
try {
db.comptes.updateOne(
{ id: "Alice" },
{ $inc: { solde: -200 } },
{ session }
)
db.comptes.updateOne(
{ id: "Bob" },
{ $inc: { solde: 200 } },
{ session }
)
session.commitTransaction()
print("Transaction validée !")
} catch (error) {
session.abortTransaction()
print("Transaction annulée :", error)
} finally {
session.endSession()
}
🧩 2. Cohérence
Exiger que le solde ne soit jamais négatif :
js
CopierModifier
db.createCollection("comptes", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["id", "nom", "solde"],
properties: {
solde: {
bsonType: "double",
minimum: 0,
description: "Le solde doit être positif"
}
}
}
}
})
Créer un index unique pour éviter les doublons :
js
CopierModifier
db.utilisateurs.createIndex({ id: 1 }, { unique: true })
Résumé MONGODB: 5
🛑 3. Isolation
Problème sans isolation :
Bob voit le solde alors que la transaction n’est pas encore validée.
Solution avec isolation :
MongoDB empêche la lecture de données non validées par une autre session.
js
CopierModifier
// Session 1 : Alice transfère 200 MAD
const s1 = db.getMongo().startSession()
s1.startTransaction()
db.comptes.updateOne({ id: "Alice" }, { $inc: { solde: -200 } }, { session: s1 })
db.comptes.updateOne({ id: "Bob" }, { $inc: { solde: 200 } }, { session: s1 })
// Session 2 : Bob essaie de lire son solde
const s2 = db.getMongo().startSession()
let soldeBob = s2.getDatabase("banque").comptes.findOne({ id: "Bob" })
print("Solde de Bob : ", soldeBob.solde)
// S1 valide la transaction
s1.commitTransaction()
💾 4. Durabilité (Durability)
Assurer que les écritures sont bien stockées sur disque, même après un crash :
js
CopierModifier
db.comptes.updateOne(
{ id: "Alice" },
{ $inc: { solde: -200 } },
{ writeConcern: { w: "majority", j: true } }
)
db.comptes.updateOne(
{ id: "Bob" },
{ $inc: { solde: 200 } },
{ writeConcern: { w: "majority", j: true } }
)
w: "majority" = confirmé par la majorité des nœuds
j: true = écrit dans le journal avant confirmation
📁 8. GridFS (Fichiers > 16 Mo):
MongoDB stocke les documents BSON avec une limite de 16 Mo.
Pour les fichiers plus gros (PDF, images, vidéos, etc.), on utilise GridFS.
🧱 Comment ça fonctionne ?
Résumé MONGODB: 6
GridFS divise le fichier en petits morceaux (chunks) et les stocke dans deux collections :
Collection Contenu
fs.files Métadonnées du fichier (nom, taille, type, etc.)
fs.chunks Les morceaux (fragments) du fichier (par défaut 255 Ko chacun)
⚙️ Commandes en ligne de commande ( mongofiles )
📤 1. Importer (uploader) un fichier :
bash
CopierModifier
mongofiles --db=mydatabase put monfichier.pdf
📥 2. Télécharger un fichier :
bash
CopierModifier
mongofiles --db=mydatabase get monfichier.pdf
❌ 3. Supprimer un fichier :
bash
CopierModifier
mongofiles --db=mydatabase delete monfichier.pdf
📝 Remplace mydatabase par le nom de ta base et monfichier.pdf par ton vrai fichier.
🐍 📄 Utilisation avec Python (via pymongo et gridfs )
📌 Installation :
bash
CopierModifier
pip install pymongo
📥 Enregistrer un fichier :
python
CopierModifier
from pymongo import MongoClient
import gridfs
client = MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
fs = gridfs.GridFS(db)
Résumé MONGODB: 7
# Lire et stocker un fichier
with open("monfichier.pdf", "rb") as f:
file_id = fs.put(f, filename="monfichier.pdf")
print(f"Fichier stocké avec ID : {file_id}")
📤 Télécharger un fichier :
python
CopierModifier
file_data = fs.get(file_id)
with open("downloaded.pdf", "wb") as f:
f.write(file_data.read())
print("Fichier récupéré avec succès.")
🛠️ 10. Administration:
📂 1. Commandes de Base
js
CopierModifier
use maBase // Créer/sélectionner une base
show dbs // Lister les bases
show collections // Lister les collections
db.createCollection("col") // Créer une collection
db.dropDatabase() // Supprimer la base active
db.col.drop() // Supprimer une collection
🧩 2. Indexation
js
CopierModifier
db.col.createIndex({ champ: 1 }) // Index croissant
db.col.getIndexes() // Lister les index
db.col.dropIndex("nomIndex") // Supprimer un index
👤 3. Utilisateurs
js
CopierModifier
db.createUser({
user: "adminUser",
pwd: "motDePasse123",
roles: [ { role: "readWrite", db: "maBase" } ]
})
db.getUsers() // Voir les utilisateurs
Résumé MONGODB: 8
🎭 4. Rôles Personnalisés
js
CopierModifier
db.createRole({
role: "customRole",
privileges: [
{
resource: { db: "test", collection: "" },
actions: [ "find", "insert" ]
}
],
roles: []
})
📊 5. Statistiques
js
CopierModifier
db.serverStatus() // Statistiques globales serveur
db.col.stats() // Stats collection spécifique
💾 6. Sauvegarde & Restauration
bash
CopierModifier
mongodump --db maBase --out /backup
mongorestore /backup/maBase
📈 7. Outils de Monitoring
bash
CopierModifier
mongostat // Activité en temps réel
mongotop // Temps d’accès aux collections
🛡️ 8. Créer un Admin Global
js
CopierModifier
use admin
db.createUser({
user: "superadmin",
pwd: "monPassSecure",
Résumé MONGODB: 9
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
🔐📌 Sécurité & 💾 Sauvegarde – MongoDB
Fiche Résumée avec Requêtes
🔐 11. SÉCURITÉ
✅ Objectifs :
Authentification (users/passwords)
TLS (chiffrement)
RBAC (contrôle par rôles)
Audit (suivi des actions)
👤 Créer un admin :
js
CopierModifier
use admin
db.createUser({
user: "admin",
pwd: "pass",
roles: [ "userAdminAnyDatabase" ]
})
🔐 Activer l’authentification (dans mongod.conf ) :
yaml
CopierModifier
security:
authorization: enabled
🔒 Connexion avec identifiants :
bash
CopierModifier
mongo -u admin -p pass --authenticationDatabase admin
💾 12. SAUVEGARDE & RESTAURATION
🧰 Outils :
mongodump → export (format BSON)
mongorestore → import (depuis dump)
mongostat → suivi en temps réel
mongotop → surveillance accès collections
Résumé MONGODB: 10
📤 Sauvegarde logique :
bash
CopierModifier
mongodump --db maBase --out /backups/maBase
♻️ Restauration logique :
bash
CopierModifier
mongorestore /backups/maBase
💾 Sauvegarde physique (snapshot système) :
Copier directement le dossier dbPath (à faire MongoDB arrêté)
☁️ MongoDB Atlas :
Propose des sauvegardes automatiques
Géré depuis l’interface web (pas besoin de commandes)
Résumé MONGODB: 11