Université MAPON
KINDU - RD.CONGO
Analyse et conception de système d’information
Master 1 Informatique
1
Passage de BD Relationnelle vers BD Orientée Document :
Identification des Entités :
● Identifier les entités du modèle relationnel. Chaque entité pourrait être
représentée par une collection dans la base de données orientée document.
Normalisation/Dénormalisation :
● Considérer la normalisation du modèle relationnel. Dans une base de
données orientée document, la dénormalisation est souvent appliquée pour
regrouper des données fréquemment utilisées dans un seul document.
Relation Un-à-Plusieurs :
● Pour les relations un-à-plusieurs dans le modèle relationnel, on peut
incorporer les informations de l'entité "plusieurs" directement dans le
document de l'entité "un".
Relation Plusieurs-à-Plusieurs :
● Pour les relations plusieurs-à-plusieurs, utiliser des tableaux dans les
documents pour représenter les connexions.
Définir les Index :
● Identifier les champs qui seront fréquemment utilisés dans les requêtes et
définir des index sur ces champs pour optimiser les performances.
Champs Dynamiques :
● Les bases de données orientées document permettent des schémas
flexibles. Si les données sont hétérogènes, cela peut simplifier le passage
du modèle relationnel vers le modèle orienté document.
Exemple :
Imaginons une modélisation relationnelle simple pour la gestion d'une bibliothèque avec
trois tables : "Livres", "Auteurs", et "Emprunts". Ensuite, je vais vous montrer comment
cela pourrait être modélisé dans une base de données orientée document.
Modèle Relationnel :
- Livres (ID_Livre, Titre, ID_Auteur, Année_Publication, Quantité_Disponible)
- Auteurs (ID_Auteur, Nom_Auteur, Nationalité)
- Emprunts (ID_Emprunt, ID_Livre, Date_Emprunt, Date_Retour, ID_Utilisateur)
Dans ce modèle, "Livres" stocke les informations sur les livres, "Auteurs" stocke les
informations sur les auteurs, et "Emprunts" stocke les détails des emprunts avec des
références aux livres et aux utilisateurs.
{
"_id": ObjectId("1"),
"titre": "Introduction to Algorithms",
"auteur": {
"id_auteur": ObjectId("101"),
"nom_auteur": "Thomas H. Cormen",
"nationalite": "American"
},
"annee_publication": 1990,
"quantite_disponible": 5,
"emprunts": [
{
"id_emprunt": ObjectId("201"),
"date_emprunt": ISODate("2023-01-15"),
"date_retour": ISODate("2023-02-01"),
"utilisateur": {
"id_utilisateur": ObjectId("301"),
"nom_utilisateur": "John Doe"
}
},
// Autres emprunts...
]
}
Dans cette partie pratique du cours, nous abordons les requêtes de base pour la
manipulation des données en MongoDB.
Nous allons exploiter la méthode CRUD pour CREATE, READ, UPDATE &
DELETE.
NB. Nous utiliserons la Base de donnees restaurant fournis dans OpenClassroom
ici :
https://openclassrooms.com/fr/courses/4462426-maitrisez-les-bases-de-donnees-n
osql/4474601-decouvrez-le-fonctionnement-de-mongodb
1. Les opérations CREATE
Les opérations de création ou d'insertion permettent d'ajouter de nouveaux documents à
une collection. Si la collection n'existe pas encore, les opérations d'insertion la créent.
- show dbs : Affiche la liste des bases de données.
- use ma_base_de_donnees : Cela crée une base de données appelée
"ma_base_de_donnees" si elle n'existe pas déjà.
- db.createCollection("ma_collection") : Cela crée une collection appelée
"ma_collection" dans la base de données actuelle.
- show collections: Affiche la liste des collections dans la base de données
Les méthodes ci-dessous sont utilisées pour insérer des documents dans une collection:
- db.collection.insertOne() Nouveau dans la version 3.2
- db.collection.insertMany() Nouveau dans la version 3.2
- db.collection.insert()
https://www.mongodb.com/docs/v3.2/crud/ Cyrille KESIKU : [email protected] 7
db.collection.insertOne() : Cette requête permet d'insérer un
document dans une collection
Exemple :
use bd_resto /* création de la base de données bd_resto
db.client.insertOne({
matricule : '003321',
nom : 'KATALA',
prénom : 'Jules',
sexe: 'M'
}) /* création de la collection client et insertion d’un document
db.collection.insertMany() /* Cette requête permet d’inserer plusieurs documents a la fois
dans une collection
Exemple :
db.client.insertMany([
{ matricule : '003322', nom : 'KILOLO', prénom : 'Pierre', sexe: 'M'},
{ matricule : '003323', nom : 'BILENDU', prénom : 'Louise', sexe:
'F'},
{ matricule : '003324', nom : 'KANDONGO', prénom : 'Alliance', sexe:
'F'}
])
/* Insertion de plusieurs (3 dans notre cas) documents dans la collection client
db.collection.insert() : /* Insère un ou plusieurs documents dans une collection.
- Pour insérer un seul document, passez un document à la méthode ;
- pour insérer plusieurs documents, passez un tableau de documents à la méthode.
Exemple :
- insert avec un document :
db.client.insert({ matricule : '003325', nom : 'KASUKU', prénom : 'Gloria
Dei', sexe: 'M'})
/* Insert un document dans la collection client.
- insert avec plusieurs document
db.client.insertMany([
{ matricule : '003326', nom : 'KALUMUNA', prénom : 'Angelo', sexe:
'M'},
{ matricule : '003323', nom : 'KIDINDA', prénom : 'Jeanne', sexe:
'F'},
{ matricule : '003324', nom : 'MBULAYI', prénom : 'Onesime', sexe:
'M'} Cyrille KESIKU : [email protected] 10
]) /* Insertion de 3 documents dans la collection client avec insert()
2. Méthode READ (lecture)
MongoDB propose la méthode db.collection.find() pour lire les documents d'une
collection. La méthode db.collection.find() renvoie un curseur vers les documents
correspondants.
Avec cette méthode on réalise plusieurs opérations de requêtes pour interroger la base de
données.
a. Exemple de lecture simple :
use bd_resto /* Accès à notre base de données bd_resto
db.client.find() /* Renvoi tous les documents dans la collection client
db.client.findOne() /* Renvoi un seul document de la collection client
b. Projection
- Retourner tous les champs des documents correspondants
db.client.find({ sexe: 'M'}) /* renvoi tous les client de sexe M (filtre)
- Retourner les champs spécifiés
db.client.find({ sexe: 'M'},{prénom : 1, sexe: 1 }) /* renvoi le
prenom et le sexe du client
{sexe: 'M'} filtre les client de sexe M et {prénom : 1, sexe: 1 } realise la
projection sur les champs prenom et sexe le 1 indique la reccuperation du champ, si
ce 0 alors le champ sera ignorer et ne s’affichiera pas.
- Accéder aux sous documents d’un document
db.resto.find({cuisine:'Bakery'},{'Name':1,cuisine:1,'grades.s
core':1})
/* Récupérer le nom, la cuisine et le score dans le sous document grades dont la
cuisine et ‘Bakery’ Cyrille KESIKU :
[email protected] 12
- Projection sur des documents intégrés dans un tableau (même chose comme dans la
requête précédente.)
db.resto.find({cuisine:'Bakery'},{'Name':1,cuisine:1,
'grades.score':1})
/*Récupérer le nom, la cuisine et le score dans le sous document grades dont la cuisine et
‘Bakery’
- Projection aux Éléments du tableau spécifiques
db.resto.find({cuisine: 'Bakery'},{'Name':1,cuisine:1,
grades:{$slice:0}})
/*Récupérer le premier élément du tableau
db.resto.find({cuisine: 'Bakery'},{'Name':1,cuisine:1,
grades:{$slice:-1}})
/*Récupérer le dernier élément du tableau
db.resto.findOne({cuisine: 'Bakery'},{'Name':1,cuisine:1,
grades:{$slice:[0,2]}})
/*Récupérer le premier et le deuxième élément du tableau sachant qu’il s’agit de l’intervalle
inclue à gauche et exclue à droite.
3. UPDATE sur le document (Mise à jour du document)
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.update()
Pour modifier un champ dans un document, MongoDB propose des opérateurs de
mise à jour, tels que $set pour modifier les valeurs.
a. db.collection.updateOne()
db.client.updateOne({'prénom':'Pierre'},{$set:{'Age':28}})
/* Modifier le champ Age, ici si le champ n’existe pas il
l’ajoute dans le document
b. db.collection.updateMany()
db.client.updateMany({'sexe':'M'},{$set:{'Home_site':'P
roche de U MAPON'}}) /* On ajoute a tous les homme le
champ Home_sie avec valeur ‘Proche de U MAPON’
c. db.collection.update()
db.client.updateMany({'sexe':'M'},{$set:{'Home_site':'Proche
de U MAPON',sexe: 'Masculin'}}) /* modifier plusieurs champs
d’un document
4. DELETE (Opération de suppression)
db.collection.deleteOne()
db.collection.deleteMany()
db.collection.remove()
a. db.collection.deleteOne()
db.client.deleteOne({sexe:'Masculin'})/* supprimer le
premier document dont le sexe est ‘Masculin’
b.db.collection.remove()
db.client.remove({sexe:'F'},1) /* supprimer tous les client
de sexe ‘F’
c.db.users.deleteMany()
db.client.deleteMany({sexe:'Masculin'}) /* supprimer tous
les client de sexe ‘Masculin’
Les opérateurs
1. Opérateurs de comparaisons
- $eq : Opérateur d'égalité
db.resto.find({ "grades.score": { $eq: 11 } }) /* sélectionne les
documents dans lesquels le score d’un grade = 11
db.resto.find({ "address.coord.coordinates": { $eq: [-73.9791458,
40.744328] } }) /* Sélection du document avec un tableau
db.resto.find({ "address.coord.coordinates": { $eq: -73.9791458} })
/* Sélection du document avec un élément du tableau
17
- $gt : strictement supérieur >
db.resto.find({ "grades.score": {$gt: 10 } })
- $gte : Superieur ou egale >=
db.resto.find({ "grades.score": {$gte: 10 } })
- $lt : Strictement inférieur à <
db.resto.find({ "grades.score": {$lt: 10 } })
- $lte : Inférieur ou égale à <=
db.resto.find({ "grades.score": {$lte: 10 } })
18
TD
1. Quels sont les détails du restaurant avec le nom "Morris Park Bake Shop"?
2. Pouvez-vous récupérer tous les restaurants situés dans le borough "Bronx"?
3. Quels sont les restaurants qui servent une cuisine de type "Bakery"?
4. Donnez-moi la liste des restaurants ayant le code postal "10462".
5. Quels sont les restaurants ayant obtenu une note "A" dans leurs évaluations?
6. Pouvez-vous me montrer les restaurants avec un score inférieur à 5 dans l'une de
leurs évaluations?
7. Quels sont les restaurants ayant reçu une évaluation après le 1er janvier 2013?
8. Donnez-moi les restaurants qui ont obtenu une note "B" avec un score inférieur à
10 dans l'une de leurs évaluations.
9. Pourriez-vous afficher uniquement le nom et le type de cuisine de chaque
restaurant?
10. Quels sont les restaurants triés par score décroissant dans leurs évaluations?