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}} +]) +