diff --git a/2A/S4/Quali_Relationnel/MongoDB/.idea/dataSources.xml b/2A/S4/Quali_Relationnel/MongoDB/.idea/dataSources.xml
index bafe47303e0fab6b0d65618992ea86ae21a3c310..ace4cbec78d0d1f4b1627e91c92736491493ea05 100644
--- a/2A/S4/Quali_Relationnel/MongoDB/.idea/dataSources.xml
+++ b/2A/S4/Quali_Relationnel/MongoDB/.idea/dataSources.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
-    <data-source source="LOCAL" name="s4c03@172.19.0.2" uuid="2f0e66bd-1827-4234-a228-7d779aabf45a">
+    <data-source source="LOCAL" name="s4c03" uuid="2c49e63a-4708-47b7-9c9e-c6c46605a21c">
       <driver-ref>mongo</driver-ref>
       <synchronize>true</synchronize>
       <jdbc-driver>com.dbschema.MongoJdbcDriver</jdbc-driver>
diff --git a/2A/S4/Quali_Relationnel/MongoDB/td4.js b/2A/S4/Quali_Relationnel/MongoDB/td4.js
new file mode 100644
index 0000000000000000000000000000000000000000..06a7bedbeca21d9c4e960e255ee5edb15521ffbe
--- /dev/null
+++ b/2A/S4/Quali_Relationnel/MongoDB/td4.js
@@ -0,0 +1,157 @@
+db.createCollection("Véhicule")
+db.createCollection("Personne")
+db.createCollection("Conducteur")
+db.createCollection("Trajet")
+db.createCollection("Voyage")
+db.createCollection("Avis")
+
+// Insertion des données dans les collections respectives
+db.Véhicule.insertMany([
+    {'plaque_immatriculation': 'ab123xz', 'marque': 'Skoda', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 4, 'annee_mise_en_service': 1999},
+    {'plaque_immatriculation': 'az426bt', 'marque': 'BMW', 'type': 'voiture', 'energie': 'électrique', 'nombre_places': 5, 'annee_mise_en_service': 1987},
+    {'plaque_immatriculation': 'rt865gb', 'marque': 'Opel', 'type': 'voiture', 'energie': 'électrique', 'nombre_places': 6, 'annee_mise_en_service': 2005},
+    {'plaque_immatriculation': 'ae452df', 'marque': 'Skoda', 'type': 'voiture', 'energie': 'électrique', 'nombre_places': 4, 'annee_mise_en_service': 1995},
+    {'plaque_immatriculation': 'aq781rt', 'marque': 'Fiat', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 4, 'annee_mise_en_service': 1999},
+    {'plaque_immatriculation': 'az745ad', 'marque': 'Nissan', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 4, 'annee_mise_en_service': 1999},
+    {'plaque_immatriculation': 'z794aed', 'marque': 'Audi', 'type': 'voiture', 'energie': 'électrique', 'nombre_places': 6, 'annee_mise_en_service': 2017},
+    {'plaque_immatriculation': 'qw120qz', 'marque': 'Nissan', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 5, 'annee_mise_en_service': 1998},
+    {'plaque_immatriculation': 'hj715ut', 'marque': 'Skoda', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 5, 'annee_mise_en_service': 2015},
+    {'plaque_immatriculation': 'ed123fr', 'marque': 'Opel', 'type': 'voiture', 'energie': 'essence', 'nombre_places': 5, 'annee_mise_en_service': 2010}
+])
+
+db.Personne.insertMany([
+    { 'id_personne': 0, 'nom': 'Hoareau', 'prenom': 'Jacqueline', 'adresse_rue': '9 Chem. de la Pelletterie', 'code_postal': 44000, 'nom_ville': 'Nantes' },
+    { 'id_personne': 1, 'nom': 'Camus', 'prenom': 'Suzanne', 'adresse_rue': '53 Rue du Douet Garnier', 'code_postal': 44000, 'nom_ville': 'Nantes' },
+    { 'id_personne': 2, 'nom': 'Fleury', 'prenom': 'Michèle', 'adresse_rue': '36 Bd Gaston Serpette', 'code_postal': 44000, 'nom_ville': 'Nantes' },
+    { 'id_personne': 3, 'nom': 'Georges', 'prenom': 'René', 'adresse_rue': '1 Rue de Joyeuse', 'code_postal': 76000, 'nom_ville': 'Rouen' },
+    { 'id_personne': 4, 'nom': 'Munoz', 'prenom': 'Théodore', 'adresse_rue': '24 Rue du Petit Pont', 'code_postal': 45000, 'nom_ville': 'Orleans' },
+    { 'id_personne': 5, 'nom': 'Clement', 'prenom': 'Inès-Sabrine', 'adresse_rue': '21 Rue René Thomas', 'code_postal': 38000, 'nom_ville': 'Grenoble' },
+    { 'id_personne': 6, 'nom': 'Launay', 'prenom': 'Henriette', 'adresse_rue': '14 Imp. de Flandre', 'code_postal': 76000, 'nom_ville': 'Rouen' },
+    { 'id_personne': 7, 'nom': 'Bonneau', 'prenom': 'Roland', 'adresse_rue': '198 Rue des Postes', 'code_postal': 59000, 'nom_ville': 'Lille' },
+    { 'id_personne': 8, 'nom': 'Lemaire-Simon', 'prenom': 'Sabine', 'adresse_rue': '46 Rue Ferrandière', 'code_postal': 69000, 'nom_ville': 'Lyon' },
+    { 'id_personne': 9, 'nom': 'Godard', 'prenom': 'Aimée', 'adresse_rue': '6 Rue de Lurbe', 'code_postal': 33000, 'nom_ville': 'Bordeaux' },
+    { 'id_personne': 10, 'nom': 'Klein', 'prenom': 'Charles', 'adresse_rue': '15 Rue Rolland', 'code_postal': 33000, 'nom_ville': 'Bordeaux' },
+    { 'id_personne': 11, 'nom': 'Dupre', 'prenom': 'Alfred', 'adresse_rue': '38 Rue Volney', 'code_postal': 49000, 'nom_ville': 'Angers' },
+    { 'id_personne': 12, 'nom': 'Roy', 'prenom': 'Alphonse', 'adresse_rue': '14 Rue du Planty', 'code_postal': 49300, 'nom_ville': 'Cholet' },
+    { 'id_personne': 13, 'nom': 'Verdier', 'prenom': 'Cécile', 'adresse_rue': '42 Rue Bourgonnier', 'code_postal': 49000, 'nom_ville': 'Angers' },
+    { 'id_personne': 14, 'nom': 'Etienne', 'prenom': 'Guy', 'adresse_rue': '2 Rue Lebas', 'code_postal': 49000, 'nom_ville': 'Angers' },
+    { 'id_personne': 15, 'nom': 'Lemaire', 'prenom': 'Luc', 'adresse_rue': '12 Rue de la Hollande', 'code_postal': 49300, 'nom_ville': 'Cholet' },
+    { 'id_personne': 16, 'nom': 'Gimenez', 'prenom': 'Pauline', 'adresse_rue': '12 Rue Amédée Morel', 'code_postal': 38000, 'nom_ville': 'Le Sappey en Chartreuse' },
+    { 'id_personne': 17, 'nom': 'Fontaine', 'prenom': 'Agnès', 'adresse_rue': '18 Quai Jean Moulin', 'code_postal': 69000, 'nom_ville': 'Lyon' },
+    { 'id_personne': 18, 'nom': 'Pruvost', 'prenom': 'Robert', 'adresse_rue': '17 Rue du Dr André Derocque', 'code_postal': 76000, 'nom_ville': 'Rouen' },
+    { 'id_personne': 19, 'nom': 'Denis', 'prenom': 'Guy', 'adresse_rue': '10 Rue Kuhlmann', 'code_postal': 59000, 'nom_ville': 'Tourcoing' }
+])
+
+db.Conducteur.insertMany([
+    { 'numero_agrement': 12564, 'date_agrement': '11-08-2018', 'certifie': 0, 'id_personne': 2 },
+    { 'numero_agrement': 13978, 'date_agrement': '28-01-2017', 'certifie': 1, 'id_personne': 5 },
+    { 'numero_agrement': 78541, 'date_agrement': '02-09-2020', 'certifie': 1, 'id_personne': 1 },
+    { 'numero_agrement': 9523, 'date_agrement': '30-03-2018', 'certifie': 1, 'id_personne': 19 },
+    { 'numero_agrement': 685, 'date_agrement': '29-08-2019', 'certifie': 0, 'id_personne': 11 },
+    { 'numero_agrement': 85423, 'date_agrement': '15-11-2019', 'certifie': 0, 'id_personne': 10 },
+    { 'numero_agrement': 78945, 'date_agrement': '20-06-2018', 'certifie': 1, 'id_personne': 17 },
+    { 'numero_agrement': 74125, 'date_agrement': '29-01-2017', 'certifie': 0, 'id_personne': 13 },
+    { 'numero_agrement': 4562, 'date_agrement': '14-05-2021', 'certifie': 0, 'id_personne': 8 }
+])
+
+db.Trajet.insertMany([
+    { 'id_trajet': 1, 'heure_dep': '2022-02-20 20-00', 'heure_des': '2022-02-20 20-52', 'longueur': 59, 'tarif': 5, 'numero_agrement': 1, 'plaque_immatriculation': 'ab123xz', 'code_postal_dep': 44000, 'code_postal_des': 49300 },
+    { 'id_trajet': 2, 'heure_dep': '2022-03-20 20-00', 'heure_des': '2022-03-20 20-52', 'longueur': 59, 'tarif': 5, 'numero_agrement': 1, 'plaque_immatriculation': 'ab123xz', 'code_postal_dep': 49300, 'code_postal_des': 44000 },
+    { 'id_trajet': 3, 'heure_dep': '2022-01-19 19-00', 'heure_des': '2022-01-19 19-52', 'longueur': 59, 'tarif': 7, 'numero_agrement': 12564, 'plaque_immatriculation': 'az426bt', 'code_postal_dep': 44000, 'code_postal_des': 49300 },
+    { 'id_trajet': 4, 'heure_dep': '2021-09-21 08-30', 'heure_des': '2021-09-21 12-40', 'longueur': 335, 'tarif': 25, 'numero_agrement': 78541, 'plaque_immatriculation': 'az745ad', 'code_postal_dep': 45000, 'code_postal_des': 44000 },
+    { 'id_trajet': 5, 'heure_dep': '2021-09-10 07-30', 'heure_des': '2021-09-10 14-10', 'longueur': 676.1, 'tarif': 51, 'numero_agrement': 685, 'plaque_immatriculation': 'az745ad', 'code_postal_dep': 45000, 'code_postal_des': 59200 },
+    { 'id_trajet': 6, 'heure_dep': '2021-08-23 11-15', 'heure_des': '2021-08-23 18-50', 'longueur': 110, 'tarif': 9.5, 'numero_agrement': 9523, 'plaque_immatriculation': 'z794aed', 'code_postal_dep': 44000, 'code_postal_des': 56000 },
+    { 'id_trajet': 7, 'heure_dep': '2021-08-12 21-30', 'heure_des': '2021-08-12 23-36', 'longueur': 201, 'tarif': 18, 'numero_agrement': 85423, 'plaque_immatriculation': 'z794aed', 'code_postal_dep': 17000, 'code_postal_des': 33000 },
+    { 'id_trajet': 8, 'heure_dep': '2021-08-03 09-10', 'heure_des': '2021-08-03 11-10', 'longueur': 226.8, 'tarif': 19, 'numero_agrement': 9523, 'plaque_immatriculation': 'hj715ut', 'code_postal_dep': 38700, 'code_postal_des': 39200 },
+    { 'id_trajet': 9, 'heure_dep': '2021-08-12 21-30', 'heure_des': '2021-08-13 03-30', 'longueur': 587.5, 'tarif': 45, 'numero_agrement': 74125, 'plaque_immatriculation': 'qw120qz', 'code_postal_dep': 45000, 'code_postal_des': 38700 },
+    { 'id_trajet': 10, 'heure_dep': '2021-08-12 15-12', 'heure_des': '2021-08-12 17-25', 'longueur': 181, 'tarif': 15, 'numero_agrement': 85423, 'plaque_immatriculation': 'qw120qz', 'code_postal_dep': 22300, 'code_postal_des': 50170 },
+    { 'id_trajet': 11, 'heure_dep': '2022-08-12 15-12', 'heure_des': '2022-08-12 17-25', 'longueur': 181, 'tarif': 12564, 'numero_agrement': 10, 'plaque_immatriculation': 'az426bt', 'code_postal_dep': 22300, 'code_postal_des': 50170 }
+])
+
+db.Voyage.insertMany([
+    { 'id_trajet': 1, 'id_personne': 2 },
+    { 'id_trajet': 1, 'id_personne': 12 },
+    { 'id_trajet': 1, 'id_personne': 15 },
+    { 'id_trajet': 1, 'id_personne': 3 },
+    { 'id_trajet': 3, 'id_personne': 9 },
+    { 'id_trajet': 3, 'id_personne': 3 },
+    { 'id_trajet': 3, 'id_personne': 6 },
+    { 'id_trajet': 3, 'id_personne': 8 }
+])
+
+db.Avis.insertMany([
+    { 'id_avis': 1, 'message': 'A', 'etoiles': 3, 'id_personne_envoie': 1, 'id_personne_recu': 2 },
+    { 'id_avis': 2, 'message': 'B', 'etoiles': 3, 'id_personne_envoie': 3, 'id_personne_recu': 2 },
+    { 'id_avis': 3, 'message': 'C', 'etoiles': 4, 'id_personne_envoie': 3, 'id_personne_recu': 2 },
+    { 'id_avis': 4, 'message': 'D', 'etoiles': 4, 'id_personne_envoie': 9, 'id_personne_recu': 2 },
+    { 'id_avis': 5, 'message': 'D', 'etoiles': 5, 'id_personne_envoie': 12, 'id_personne_recu': 2 },
+    { 'id_avis': 6, 'message': 'A', 'etoiles': 1, 'id_personne_envoie': 13, 'id_personne_recu': 1 },
+    { 'id_avis': 7, 'message': 'B', 'etoiles': 5, 'id_personne_envoie': 14, 'id_personne_recu': 1 },
+    { 'id_avis': 8, 'message': 'A', 'etoiles': 5, 'id_personne_envoie': 18, 'id_personne_recu': 1 },
+    { 'id_avis': 9, 'message': 'C', 'etoiles': 5, 'id_personne_envoie': 7, 'id_personne_recu': 1 },
+    { 'id_avis': 10, 'message': 'C', 'etoiles': 3, 'id_personne_envoie': 5, 'id_personne_recu': 8 },
+    { 'id_avis': 11, 'message': 'A', 'etoiles': 2, 'id_personne_envoie': 9, 'id_personne_recu': 8 },
+    { 'id_avis': 12, 'message': 'D', 'etoiles': 1, 'id_personne_envoie': 9, 'id_personne_recu': 8 }
+])
+// Création de la table "ville" et insertion des données
+db.createCollection("Ville")
+db.Personne.find().forEach(function(personne) {
+    db.Ville.insert({ "code_postal": personne.code_postal, "nom_ville": personne.nom_ville })
+})
+
+// Suppression de la colonne "nom_ville" dans la table "Personne"
+db.Personne.updateMany({}, { $unset: { "nom_ville": "" } })
+
+
+db.Conducteur.aggregate([
+    {$lookup: {
+            from: "Personne",
+            localField: "id_personne",
+            foreignField: "id_personne",
+            as: "personnes"
+        }},
+    {$lookup: {
+            from: "Ville",
+            localField: "personnes.code_postal",
+            foreignField: "code_postal",
+            as: "villes"
+        }},
+    {$lookup: {
+            from: "Trajet",
+            localField: "numero_agrement",
+            foreignField: "numero_agrement",
+            as: "trajets"
+        }},
+    {$lookup: {
+            from: "Véhicule",
+            localField: "trajets.plaque_immatriculation",
+            foreignField: "plaque_immatriculation",
+            as: "vehicules"
+        }},
+    {$match:{$and:[{"vehicules.annee_mise_en_service":{$lt :2000}},{"villes.nom_ville":"Nantes"}]}},
+    {$project:{"numero_agrement":1,"id_personne":1,"vehicules.energie": 1}}
+])
+
+db.Conducteur.aggregate([
+    {$lookup: {
+            from: "Personne",
+            localField: "id_personne",
+            foreignField: "id_personne",
+            as: "personnes"
+        }},
+    {$lookup: {
+            from: "Ville",
+            localField: "personnes.code_postal",
+            foreignField: "code_postal",
+            as: "villes"
+        }},
+    {$lookup: {
+            from: "Avis",
+            localField: "id_personne",
+            foreignField: "id_personne_recu",
+            as: "avis"
+        }},
+    {$match:{$and:[{"avis.etoiles":{$not:{$lt:3}}},{"villes.nom_ville":"Nantes"}]}},
+    {$project:{"numero_agrement":1,"id_personne":1,"avis.etoiles": 1}}
+])
+