Questions d'entretien MongoDB
1. Qu'est-ce que MongoDB et quand l'utiliser ?
MongoDB est une base de donnees NoSQL orientee documents qui stocke les donnees au format BSON (Binary JSON). Utilisez MongoDB pour : les schemas flexibles et evolutifs, les applications avec des donnees semi-structurees, les charges de travail necessitant une scalabilite horizontale, les applications temps reel, et les prototypes rapides. Evitez-le pour : les transactions complexes multi-collections, les donnees hautement relationnelles, et les requetes analytiques complexes.
2. Expliquez la modelisation de donnees : embedding vs referencing.
L'embedding (imbrication) stocke les donnees liees dans le meme document. Exemple : un article avec ses commentaires dans un seul document. Avantages : lectures rapides (une seule requete), atomicite au niveau du document. L'inconvenient : duplication de donnees, limite de 16 Mo par document. Le referencing stocke une reference (ID) vers un autre document. Avantages : pas de duplication, documents plus petits. Inconvenient : necessite un lookup supplementaire. Regle generale : embeddez si les donnees sont toujours lues ensemble, referencez si elles sont independantes.
3. Comment fonctionne l'indexation dans MongoDB ?
Les index accelerent les requetes en creant une structure de donnees (B-tree) qui pointe vers les documents. Types d'index : single field (un champ), compound (plusieurs champs, l'ordre compte), multikey (champs tableau), text (recherche plein texte), geospatial (donnees geographiques), hashed (distribution uniforme pour le sharding). Utilisez explain() pour analyser l'utilisation des index. Attention : chaque index consomme de la memoire et ralentit les ecritures.
4. Qu'est-ce que l'Aggregation Pipeline ?
L'Aggregation Pipeline est le framework de transformation de donnees de MongoDB. Il enchaine des stages qui transforment les documents : $match (filtrage), $group (agregation), $sort (tri), $project (projection), $lookup (jointure), $unwind (depilement de tableaux), $addFields, $bucket, $facet. Les stages sont executes sequentiellement et peuvent etre optimises par MongoDB. C'est plus puissant que les simples requetes find() pour l'analyse de donnees.
5. Expliquez le sharding dans MongoDB.
Le sharding est la strategie de partitionnement horizontal de MongoDB pour distribuer les donnees sur plusieurs serveurs. Composants : shard (un replica set stockant une partie des donnees), mongos (routeur de requetes), config servers (metadonnees de partitionnement). La shard key determine comment les donnees sont distribuees. Choisissez une shard key avec une haute cardinalite et qui correspond a vos patterns de requetes. Strategies : ranged (plages de valeurs) ou hashed (distribution uniforme).
6. Comment fonctionne la replication dans MongoDB ?
La replication utilise les Replica Sets : un noeud primary recoit toutes les ecritures, et des noeuds secondary repliquent les donnees de maniere asynchrone via l'oplog (operations log). Si le primary tombe, une election automatique choisit un nouveau primary parmi les secondaries. Configuration minimale : 3 noeuds (ou 2 + 1 arbiter). Les lectures peuvent etre dirigees vers les secondaries (readPreference) pour distribuer la charge, mais avec un risque de donnees legerement obsoletes.
7. Qu'est-ce que les transactions dans MongoDB ?
Depuis MongoDB 4.0, les transactions multi-documents sont supportees. Elles garantissent l'ACID (Atomicite, Coherence, Isolation, Durabilite) sur plusieurs documents et collections. Utilisez-les quand vous devez modifier plusieurs documents de maniere atomique (transfert bancaire, commande e-commerce). Attention : les transactions ont un cout en performance et doivent rester courtes. Dans la plupart des cas, une bonne modelisation (embedding) evite le besoin de transactions.
8. Comment optimiser les performances de MongoDB ?
Strategies : creer des index adaptes a vos requetes (utilisez explain()), limiter la taille des documents (eviter les tableaux qui grandissent indefiniment), utiliser la projection pour ne lire que les champs necessaires, configurer le WiredTiger cache correctement, monitorer avec mongostat et mongotop, utiliser le connection pooling, et dimensionner les replica sets selon la charge de lecture.
9. Expliquez la difference entre find(), findOne() et aggregate().
find() retourne un curseur sur tous les documents correspondant au filtre. Il supporte la projection, le tri, la limite et le skip. findOne() retourne un seul document (le premier correspondant). aggregate() utilise l'Aggregation Pipeline pour des transformations complexes (groupements, jointures, calculs). Utilisez find() pour les requetes simples, aggregate() pour les analyses complexes. aggregate() est generalement plus performant que plusieurs find() enchaines.
10. Comment securiser une instance MongoDB ?
Bonnes pratiques : activer l'authentification (SCRAM, x.509, LDAP), configurer l'autorisation avec des roles granulaires (readWrite, dbAdmin, etc.), activer le chiffrement au repos (encryption at rest) et en transit (TLS/SSL), configurer le bind IP pour limiter les interfaces d'ecoute, utiliser le auditing pour tracer les operations sensibles, et toujours mettre a jour vers la derniere version stable.