MongoDB - Bonnes Pratiques

Guide des meilleures pratiques pour concevoir, développer et maintenir des applications MongoDB performantes.

Conception du Schéma

✅ Bonnes pratiques

  • Modéliser selon les besoins de l'application
  • Privilégier l'embedding pour les données fréquemment accédées ensemble
  • Utiliser des références pour les données volumineuses ou rarement accédées
  • Concevoir pour les cas d'utilisation les plus fréquents

❌ À éviter

  • Documents trop volumineux (limite de 16MB)
  • Tableaux sans limite de taille
  • Noms de champs trop longs
  • Relations many-to-many complexes

Indexation

Stratégies d'indexation

// Index composé pour les requêtes fréquentes
db.users.createIndex({
    email: 1,
    status: 1
})

// Index pour tri
db.products.createIndex({
    category: 1,
    created_at: -1
})

// Index texte pour recherche
db.articles.createIndex({
    title: "text",
    content: "text"
}, {
    weights: {
        title: 2,
        content: 1
    }
})
Note : Surveillez l'utilisation des index avec :
db.collection.aggregate([
    { $indexStats: {} }
])

Optimisation des Performances

Requêtes efficaces

// Projection pour limiter les données
db.users.find(
    { status: "active" },
    { name: 1, email: 1 }
)

// Pagination avec limit/skip
db.posts.find()
    .sort({ created_at: -1 })
    .skip(20)
    .limit(10)

// Utiliser explain() pour analyser
db.orders.find({
    status: "pending"
}).explain("executionStats")

Gestion du cache

// Taille du working set
db.stats()

// Statistiques de la collection
db.collection.stats()

// Conseils de performance
mongosh --eval "
    db.users.find().hint({ email: 1 })
    db.orders.find().allowDiskUse()
"

Sécurité

Authentication et Autorisation

// Créer un utilisateur avec rôles
db.createUser({
    user: "appUser",
    pwd: "secure_password",
    roles: [
        { role: "readWrite", db: "myapp" },
        { role: "read", db: "reporting" }
    ]
})

// Activer l'authentification
mongod --auth

Encryption

// Encryption at rest
mongod --enableEncryption \
    --encryptionKeyFile key.file

// Champs sensibles
db.users.insertOne({
    name: "John",
    ssn: new Binary(encryptData("123-45-6789"),
        ENCRYPTION_DETERMINISTIC)
})

Maintenance et Surveillance

  • Sauvegardes régulières
    mongodump --db myapp --out /backup/
    mongorestore --db myapp /backup/myapp/
  • Monitoring
    // Opérations en cours
    db.currentOp()
    
    // Statistiques serveur
    db.serverStatus()
    
    // Métriques de performance
    db.getProfilingStatus()
  • Maintenance
    // Compactage et réparation
    db.repairDatabase()
    
    // Défragmentation
    db.runCommand({ compact: "collection" })