Ce projet migre un CSV de données médicales vers une base MongoDB conteneurisée. Il inclut : un script Python d'import (loader.py), la création d'utilisateurs et rôles (init-mongo.js), et une orchestration Docker.
mongodb_docker_medical/
│
├── data/
│ └── healthcare_dataset.csv # Dataset médical (CSV)
│
├── initdb/
│ └── init-mongo.js # Script d'initialisation des utilisateurs & rôles MongoDB
│
├── loader/
│ ├── Dockerfile # Image Python pour lancer le loader
│ └── loader.py # Script d'import du CSV vers MongoDB
│
├── .env # Variables d'environnement (local, non versionné)
├── .env.example # Exemple d'environnement (public, modèle)
├── docker-compose.yml # Orchestration Docker (MongoDB + loader)
│
├── README.md # Documentation principale
├── requirements.txt # Dépendances Python (loader)
│
├── Screenshot_realisation/ # Captures de réalisation (logs, Compass, étapes)
│ ├── etape 1 migration auto... # Screenshot migration automatique
│ ├── Etape 2 verifier... # Screenshot vérification de visualisation mongosh et compass
│ ├── cmd_docker_show_all_users.png # Screenshot utilisateurs Mongo
│ ├── logs_docker_desktop.docx # Rapport logs Docker
│ └── vscode_architecture_dossier... # Schéma VSCode architecture
│
└── cheat_sheet_mongo.md # Aide-mémoire MongoDB
# 1) Cloner
git clone https://github.com/AntoineKelleni/Maintenez-et-documentez-un-systeme-de-stockage-des-donnees.git
cd mongodb_docker_medical
# 2) Configurer l'environnement
cp .env.example .env # (ou compléter le .env fourni)
# Vérifier les variables (utilisateurs, mots de passe, chemins)
# 3) Démarrer
docker compose up -d --build
# 4) Vérifier les logs
docker compose logs loader
docker compose logs mongodb
# 5) Conteneurs
docker compose psCollection principale : patients (un document = un patient)
La base de données contient une seule collection : patients. Voici la structure de la collection :
| Champ | Type | Description |
|---|---|---|
Name |
string | Nom du patient |
Age |
int | Âge du patient |
Gender |
string | Genre du patient |
Blood_Type |
string | Groupe sanguin du patient |
Medical_Condition |
string | Pathologie principale du patient |
Date_of_Admission |
date | Date d'admission à l'hôpital |
Doctor |
string | Médecin en charge du patient |
Hospital |
string | Nom de l'hôpital où le patient a été admis |
Insurance_Provider |
string | Assureur du patient |
Billing_Amount |
float | Montant de la facture associée au patient |
Room_Number |
int | Numéro de la chambre assignée au patient |
Admission_Type |
string | Type d'admission (Urgent, Emergency, etc.) |
Discharge_Date |
date | Date de sortie de l'hôpital |
Medication |
string | Médication prescrite au patient |
Test_Results |
string | Résultats des tests médicaux (Normal, Inconclusive, etc.) |
Exemple de document :
{
"patient_id": "123456",
"first_name": "John",
"last_name": "Doe",
"age": 45,
"gender": "Male",
"height_cm": 180,
"weight_kg": 85,
"bmi": 26.2,
"diagnoses": ["Hypertension"],
"medications": [
{ "name": "Atorvastatin", "dose": "10mg", "start_date": "2023-01-01", "end_date": null }
],
"last_visit_date": "2023-12-05T00:00:00Z",
"notes": "Patient stable"
}patient_id(unique si possible)db.patients.createIndex({ patient_id: 1 }, { unique: true, name: "ux_patient_id" })
last_visit_datepour accélérer les requêtes temporelles.- Index composé
{ age: 1, gender: 1 }pour filtrer sur profil.
Le script
loader.pycrée un indexidx_patient_idsi la colonnepatient_idexiste.
Les utilisateurs sont créés au démarrage par init-mongo.js à partir des variables .env.
-
admin (root interne Mongo – base
admin)Maintenance et opérations privilégiées. À réserver aux admins.
-
appuser – rôle
readWritesurhealthcareCompte applicatif (principe du moindre privilège).
-
readOnlyUser – rôle
readsurhealthcareConsultation uniquement (reporting, analyse ad hoc).
-
supportUser – rôles
read,readWrite,dbAdminsurhealthcareSupport technique : peut lire/écrire et gérer index/collections.
-
adminUser – rôles
readWrite,dbAdmin(DBhealthcare) +clusterAdmin(DBadmin)Supervision avancée (opérations de haut niveau).
Importer le CSV dans la collection patients de la base healthcare, avec nettoyage basique et gestion d'index.
MONGO_HOST,MONGO_PORT,MONGO_DB,MONGO_COLLECTIONAPP_USER,***********(utilisateur applicatif)CSV_PATH"mongodb_docker_medical\data\healthcare_dataset.csv"
Le
docker-compose.ymlpasse ces variables et monte le CSV dans/data/.
-
Connexion MongoDB via URI authentifiée :
mongodb://<APP_USER>:<**********>@<MONGO_HOST>:<MONGO_PORT>/<MONGO_DB> -
Lecture du CSV avec
pandas.read_csv(). -
Nettoyage des colonnes (
sanitize_columns) :- Trim des espaces, remplacement des espaces/points/tirets par
_ - Harmonisation des noms de colonnes
- Trim des espaces, remplacement des espaces/points/tirets par
-
Tentative de parsing de dates (
try_parse_dates) :- Toute colonne contenant
dateest convertie endatetime(si possible)
- Toute colonne contenant
-
Déduplication :
- Si une colonne candidate (
patient_id,id,_id,patientid) existe →drop_duplicates(subset=...) - Sinon →
drop_duplicates()global
- Si une colonne candidate (
-
Normalisation des valeurs manquantes :
- Conversion des
NaNpandas enNonepour compatibilité BSON
- Conversion des
-
Insertion en masse :
insert_many(records, ordered=False)avec gestion d'erreurBulkWriteError
-
Index :
- Création de
idx_patient_idsipatient_idest présent
- Création de
-
Logs :
- Nombre de lignes initial vs. insérées, taille finale de la collection
docker compose logs -f loader
docker exec -it mongodb mongosh -u admin -p adminpass --authenticationDatabase adminuse healthcare
db.patients.countDocuments({})
db.patients.findOne()
db.patients.getIndexes()Voir requirements.txt :
pandas~=2.2.2
pymongo~=4.8.0Installer en local (optionnel) :
python -m venv .venv
source .venv/bin/activate # (Linux/Mac) ou .venv\Scripts\activate (Windows)
pip install -r requirements.txt# Sauvegarde
docker exec -it mongodb mongodump --db healthcare --out /backup
docker cp mongodb:/backup ./backup
# Restauration
docker exec -it mongodb mongorestore --drop /backup- Utiliser le principe du moindre privilège (app =
appuser).
- Cheat sheet Mongo : commandes
mongoshet Docker courantes (voircheat_sheet_mongo.md).
