Vous êtes sur la page 1sur 43

Atelier

Gestion Des Données Massives

2020-2021 IKRAM Chebbi


MongoDB : Base de données
Documentaire
 open-source

 Développé en C++

 disponibilité de plusieurs fonctionnalités SQL (count, group by, order by, sum, avg...)

 possibilité d’accéder aux données via une console JavaScript

 des drivers disponibles pour plusieurs langages de programmation (Java, JavaScript,

PHP, Python, Ruby...)

 données stockées sous format JSON (JavaScript Object Notation)

 SGBD NoSQL le plus populaire en 2017 (et le plus utilisé en France)

 utilisé par MTV, Disney, Doodle...


MongoDB : Base de données
Documentaire
MongoDB : une base de données documentaire
 Un document est un ensemble de paires de clés/ valeurs.
 Les documents ont un schéma dynamique.

RDBMS MongoDB
Database Database
Table Collection
Tuple/Row Document
column Field
Table Join Embedded Documents
Primary Key Primary Key (Default key _id provided by
mongodb itself)
En BDR, tous les tuples d’une table ont les mêmes champs (mais les valeurs peuvent
être différentes
Dans une collection MongoDB, les documents peuvent ne pas avoir aucun champ en commun.
MongoDB : Base de données
Documentaire
 Exemple
Id_etud Nom_etud Prenom_etud

1 Hammouda Mohamed Ligne/enregistrement/tuple


2 Chebbi Ikram

TABLE : ETUDIANT
Collection Colonne Valeur
ETUDIANT Id_etudiant 1
ETUDIANT Nom_Etud Hammouda Document
ETUDIANT Prenom_Etud Mohamed
ETUDIANT Id_etudiant 2 MongoDB enregistre toutes nos
ETUDIANT Nom_Etud Chebbi donnees, saisies sous format
JSON, dans le format binaire
ETUDIANT Prenom_Etud Ikram
BSON
CLLECTION : ETUDIANT
MongoDB : Base de données
Documentaire
 Règles de passage du modèle relationnel au modèle
documentaire

 Toute table T du modèle relationnel peur être modélisée


sous la forme d’une collection et on peut utiliser comme nom
de collection le nom de la table

 Toute relation R du modèle relationnel peur être modélisée


sous la forme d’une collection. Les colonnes de la collection
doivent reprendre les clés primaires des entités en relation
et les attributs éventuels de la relation
Les types sous MongoDB

 Number
 Boolean
 String
 Array
 Object
 Null
MongoDB : Base de données
Documentaire
 Installation de MongoDB : server
MongoDB : Base de données
Documentaire
 Installation de MongoDB : server
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB :DataBase & Collections
 Si la base de données n'est pas dans /data/db on doit spécifier le
chemin avec –dbpath
mongod --dbpath db/
 afficher toutes les base de données
show dbs
Par défaut
 utiliser la base "madatabase"
use madatabase il existe deux bases de données
 voir dans quelle base on est admin et local
db
si on ne se connecte pas à une base
 afficher les collections de données, on travaille dans une
show collections base de données appelée test
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : DataBase & Collections
 effacer la base dans laquelle on est
db.dropDatabase()
 Insertion : Création d’une collection
db.Film.insert({ Titre: 'Quentin', annee : 'Busuttil' })
 renommer une collection
db.oldname.renameCollection("newname")
 effacer une collection
db.contacts.drop()
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Sélections
 Parcourir toute une collection
db.Film.find ()
 Trier un document
db.Film.find ().sort({"title": 1})
 Savoir combien de documents comprend le résultat?
db.Film.count ()
 Les options skip et limit permettent de “paginer” le
résultat. La requête suivante affiche 12 documents à
partir du dixième inclus.
db.Film.find ().skip(9).limit(12)
MongoDB : Base de données
Documentaire
 Chaque document possède un _id attribué par l’utilisateur ou
par MongoDB (ObjectId). Le champ id constitue l’index de la
collection.
Ajout d’un document
 Deux syntaxes :

 db.nomCollection.insert({clé1 : ’val1’, clé2 : ’val2’ ... })


 obj=({clé1 :’val1’, clé2: ’val2’ ... }) ensuite
db.nomCollection.save(obj) (save ajoute l’élément s’il
n’existe pas, sinon elle le modifie en écrasant le contenu
précédent)
Pour faire plusieurs insertions au même temps
db.nomCollection.insert( [ {cl´e1 : ’val1’, cl´e2: ’val2’ ... }, {cl´eN : ’valN’, cl´eM : ’valM’ ...} ] )
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Sélections : Critère de Recherche
 Recherche en fonction de l’identifiant
db.Film.find ({"_id": « film:2"})
 Une requête sur l’identifiant ramène (au plus) un seul document.
db.FilmfindOne ({"_id": « film:2"})
 Restreindre le resulat de la requête
db.Film.find ({"title": "Alien"})
 Recherche avec des expressions régulières + Projection
db.Film.find ({"title": /^Re/})
 Recherche avec un interval de valeurs
db.movies.find( {"year": { $gte: "2000", $lte: "2005" } })
 Trier le résultat de recherche dans l’ordre croissant
db.personne.find().sort({name: 1})
 Trier le re´sultat de recherche dans l’ordre décroissant
db.personne.find().sort({name: -1})
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Sélections : Critère de
Recherche
 Afficher le résultat au format JSON
db.personne.find().pretty();
 Et si on veut seulement afficher quelques champs
db.personne.find({},{nom:1})
affiche le nom de toutes les personnes ainsi que leurs identifiants (qui sera affiché
automatiquement)
 Et si on ne veut pas afficher les id
db.personne.find({},{nom:1, id: 0 })
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Sélections : Critère de
Recherche
 Appeler une fonction pour chaque document de la sélection
db.personne.find().forEach( function(perso){
print(perso.nom +" "+ perso.prenom);});
 Peut-on utiliser les expression régulières ?
chercher les personnes dont le nom commence
par w : chercher les personnes dont le nom
commence par e ou par h :
db.personne.find({name:/∧w/}
) db.personne.find({name
chercher les personnes dont le nom se termine :/∧[eh]/})
par k :

db.personne.find({name:/k$/
})
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Sélections : Projection
 Projection d’une colonne
db.movies.find( {"year": { $gte: "2000", $lte: "2005" } }, {"title": 1} )
 Projection de toutes les colonnes à l’exception de
celles spécifier dans la requête
db.movies.find ({« Titre": « film1"}, {« annee": null, « realisateur":
0})
 Verifiez cette requête
db.movies.find ({« Titre": « film1"}, {« annee": null, « realisateur":
1})
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Opérateurs ensemblistes&booléens
 Opérateur in
db.film.find({“titire": {$in: [“film1", "artist:98"]}})
 Opérateur all
db.film.find({“titire": {$in: [“film1", "artist:98"]}})
 Opérateur nin
db.film.find({“titire": {$nin: [“film1", "artist:98"]}})
 Trouver des documents qui n’ont pas un attribut donné
db.film.find({"sommaire": {$exists: false}})
 Agréger des conditions
db.film.find({$or : [{"sommaire": ‘blabla’},{titre: “film1"})
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Jointures
La jointure, n’existe pas en MongoDB. C’est une
limitation très importante du point de vue de la
gestion de données. Incohérente avec une approche
documentaire dans laquelle les documents sont
supposés indépendants les uns des autres, avec une
description interne suffisamment riche pour que toute
recherche porte sur le contenu du document lui-même.
Parcontre ceci peut être effectué coté client (java,
nodeJs,c#…)
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Manipulation des
données
Quelle commande pour faire la modification ?
 db.nomCollection.update() prend au moins deux paramètres :
élément(s) concernés par la modification, le type de modification
 Il existe d’autres méthodes de mise-à-jour
 updateOne() : pour modifier le premier enregistrement de
la sélection (par défaut)
 updateMany() : pour modifier toute la sélection
 replaceOne() : pour remplacer le premier élément de
la sélection
MongoDB
MongoDB
: Base de données
Documentaire
Qu’est ce qu’on peut faire comme modification ?

$set : pour modifier la valeur d’un champ


$unset : pour supprimer un champ
$inc : pour incrémenter la valeur d’un champ
$mul : pour multiplier l’ancienne valeur d’un champ par la valeur
spécifiée
$rename : pour renommer un champ
$min : pour modifier la valeur d’un champ si elle est supérieure à
la valeur speécifiée par min (et inversement pour max)
...
MongoDB : Base de données
Documentaire
 Requêtes avec MongoDB : Manipulation des données
 l'option { upsert: true } permet de créer le document s'il n'existe pas;
db.film.update({ _id: x }, { $set: {"titre": "Baboo" } })
db.film.update({ _id: x }, { $set: {"titre": "Baboo" } },{multi:true})
 effacer un champ
db.film.update({ _id: x }, { $unset: { contacts: "" } })
 renommer un champ
db.users.update({}, { $rename: { "ancien_nom": "nouveau_nom" } }, { multi:
true })
 effacer un champ de tous les document d'une collection : correspond à ALTER TABLE
film DROP COLUMN annee
db.users.update({}, { $unset: { annee: "" } }; {multi: true} )
 effacer un document
db.contacts.remove ({ _id: ObjectId("55accc6c039c97c5db42f192") })
 effacer tous les documents d'une collection
db.contacts.remove({})
MongoDB : Base de données Documentaire

Exemple
db.personne.update({nom: "bob"},
{$set:{ville:’Marseille’}})
Explication
On commence par sélectionner les documents dont le champ nom
contient comme valeur bob
Si on n’utilise pas updateMany, seul le premier document de la
collection personne sera concerné par la modification
Pour ce document, on mettra la valeur Marseille pour le champ
ville s’il existe. Sinon, le champ ville sera créé avec la valeur
Marseille.
32 / 97
MongoDB : Base de données Documentaire

Exemple
db.personne.update({nom: "bob"},
{$set:{ville:’Marseille’}, {multi:true}})
Explication
On commence par sélectionner les documents dont le champ nom
contient comme valeur bob
Avec {multi:true}, tous les documents de la collection
personne dont le champ nom a la valeur bob seront concernés
par la modification (c’est l’équivalent de updateMany)
Pour ces documents, on affectera la valeur Marseille pour le
champ ville s’il existe. Sinon, le champ ville sera créé avec
32 / 97
MongoDB : Base de données Documentaire

Exemple: Et si on veut supprimer un champ d’un document?


db.personne.update({nom: "bob"},
{$unset:{prenom:1}})
Explication
On commence par sélectionner les documents dont le champ
nom contient comme valeur bob
Si on ne précise aucun critère de sélection, le premier
document de la collection personne sera concerné par
la modification
Pour ce(s) document(s), on supprimera le champ prenom
s’il existe.
32 / 97
MongoDB : Base de données Documentaire

Exemple: Et si on veut incrémenter un champ d’un document?


db.personne.update({nom: "bob"}, {$inc:{age:20}})
Explication
On commence par sélectionner les documents dont le champ
nom contient comme valeur bob
Si on ne précise aucun critère de sélection, le premier
document de la collection personne sera concerné par
la modification
Pour ce(s) document(s), on incrémentera de 20 l’age pour
s’il existe. Sinon, le champ age sera créé avec la valeur
20.
32 / 97
MongoDB : Base de données Documentaire

On peut aussi faire plusieurs modifications avec une seule requête


db.personne.update({nom: "bob"}, {$inc:{age:20},
$unset:{prenom:1} })
Explication
Avec cette requête, on incrémente l’age et on supprime le champ
prenom pour le premier document ayant un champ nom qui a
comme valeur bob

32 / 97
MongoDB : Base de données Documentaire

Et si on veut renommer un champ


db.personne.updateMany( {}, { $rename: { nom:
’name’ } } )
Explication
On commence par sélectionner tous les documents
Pour ces documents, le champ nom sera renommé name

32 / 97
MongoDB : Base de données Documentaire

Supprimer un document
db.personne.remove({nom: "bob"})

Explication
On commence par sélectionner les documents dont le champ nom
contient comme valeur bob
Ensuite tous ces documents seront supprimés

32 / 97
Application

Considérons le document suivant :


db.personne.insert({ id : 5, nom : ’wick’,
sport: [ ’foot’, ’hand’, ’tennis’] })

Ajouter un nouveau sport au tableau


db.personne.update( { id: 5 }, { $push: {
"sport": "basket" } } )

32 / 97
Application

Considérons le document suivant :


db.personne.insert({ id : 5, nom : ’wick’,
sport: [ ’foot’, ’hand’, ’tennis’] })

Ajouter un nouveau sport au tableau


db.personne.update( { id: 5 }, { $push: {
"sport": "basket" } } )

Comment ajouter plusieurs sports avec une seule requête ?


db.personne.update( { id: 5 }, { $push: {
"sport": { $each: [’basket’,’sky’] } } } )

32 / 97
Application

si on veut ajouter un élément à une position précise


db.personne.update( { id: 5 }, { $push: {
"sport": { $each: [’volley’], $position: 2 } } }
)

Ceci rajoute l’élément volley à la position 2 du tableau sport


(la première position est d’indice 0)
Les autres éléments seront décalés

32 / 97
Application

Comment supprimer le premier élément d’un tableau ?


db.personne.update( { id: 5 }, { $pop: { sport:
-1 } } )

Comment supprimer le dernier élément d’un tableau ?


db.personne.update( { id: 5 }, { $pop: { sport: 1 } }
)

Comment supprimer un élément quelconque d’un tableau ?


db.personne.update( { id: 5 }, { $pull: { "sport":
"foot" } } )
supprime l’élément foot du tableau sport

32 / 97
Application

Considérons le document créé de la façon suivante :


db.personne.insert({
_id : 6,
nom : ’wick’,
sport : [ ’foot’, ’hand’, ’tennis’]
})
Si on exécute Le résultat sera :
{
db.personne.update(
"_id" : 6, "nom" : "wick",
{ _id: 6 },
"sport" : [
{$push: {
"hand",
sport: {
"tennis",
$each: [ ’hockey’,
"hockey",
’sky’, ’volley’ ],
"sky", "volley"
$slice: -5
]
}
}
}
})
Ensuite db.personne.find({_id:6}).pretty();
32 / 97
Application

Et quand il s’agit d’un tableau d’objet ?


Considérons le document suivant :
db.personne.insert({
_id : 10,
nom : ’wick’,
notes: [
{’programmation’: 17, ’coefficient’: 4},
{’OS’: 10, ’coefficient’: 2}
]
})
Comment ajouter un nouvel élément au tableau ?
db.personne.update(
{ _id: 10 },
{ $push:
{ notes :
{’compilation’: 15, ’
coefficient’: 1}
}
}) 32 / 97
Application

Et pour supprimer ?
db.personne.update(
{ _id: 10 },
{ $pull:
{ notes :
{’compilation’: 15, ’coefficient’: 1}
}
}
)

Pour chercher un document selon une valeur dans son tableau d’objet
db.personne.find(
{"notes.programmation":
{$ne:17}
}
) Cela permet de chercher toutes les
personnes dont la note en programmation
est différente de 17. 32 / 97
Application
On considère la collection suivante (étudiant):

sélectionner les étudiants âgés de plus de 30 ans


db.etudiant.find({"age":{$gt: 30}})
sélectionner les étudiants dont l’âge est entre 30 et 40 ans
db.etudiant.find(
{$and:
[
{ age:{$gte: 30}},
{ age:{$lte:40}}
]
}
) 32 / 97
Application
On considère la collection suivante (étudiant):

Afficher les personnes dont le champ name existe


db.personne.find(
{name:
{$exists:true}
}
)

32 / 97
Les index

 Si on a un champ (autre que _id) selon lequel on


effectue des recherches très fréquemment
 Pour accélérer la recherche, on peut créer un index sur
ce champ
 Par défaut, on a un index sur chaque id d’une collection
(et il est impossible de le supprimer)

Pour consulter la liste d’index sur la collection personne


db.personne.getIndexes();
Pour cre´er un nouvel index sur le champ
nom
32 / 97
MongoDB : Base de données
Documentaire
 Développement coté Clients : JSE
 Le driver de MongoDB (client MongoDB) est disponible sur l’adresse
suivante : Mvnrepository.com
MongoDB : Base de données
Documentaire
 Développement coté Clients : les éléments de base pour la
connexion à Mongo
 Connexion BD : MongoClient
 MongoClient mongo= new MongoClient();
 DB db=mongo.getDB("bibliotheque");
 Lister les BD de Mongo: MongoClient
 for (String s : mongo.getDatabaseNames())
System.out.println(s);
 Ajout d’information dans une collection
 DBCollection objCollectionAuteur= db.getCollection("Auteur");
BasicDBObject objAuteur = new BasicDBObject();
objAuteur.put("num", "123");
objCollectionAuteur.insert(obj);
MongoDB : Base de données
Documentaire
 Développement coté Clients : les éléments de base
pour la connexion à Mongo
 Récupération d’un document d’une collection
DBObject objReupere= objCollection.findOne();
System.out.println(objReupere);
 Récupération de plusieurs documents d’une collection
DBCurseur objsReuperes= objCollection.find();
System.out.println(objReupere);
while(objsReuperes.hasNext())
System.out.println(objsReuperes.next());
MongoDB : Base de données
Documentaire
 Développement coté Clients : les éléments de
base pour la connexion à Mongo
 Recherche d’un élément à partir d’un champ
Pattern nom_a_rechercher=Pattern.compile("Mohamed",
Pattern.CASE_INSENSITIVE);
BasicDBObject requete= new BasicDBObject("Nom",
nom_a_rechercher);
DBCursor curseur=objCollection.find(requete);
while(curseur.hasNext())
System.out.println(curseur.next());
MongoDB : Base de données
Documentaire
 Application : Gestion d’une Bibliothèque
 Modèle Relationnel : Auteur (numero,nom_A,prenom_A,domicile_A)
Livre (isbn_L,titre_L,prix_L, #num_A)

Vous aimerez peut-être aussi