Data">
Nothing Special   »   [go: up one dir, main page]

BD NoSQL GLSI 1

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 56

Bases NoSQL orientées Document

Licence GLSI, ESP, UCAD

Dr Mouhamadou Lamine Ba

Mars 2023
Plan
• Concepts de base

• Modélisation logique et JSON

• Présentation et installation de MongoDB

• Opérations CRUD et Agrégats dans MongoDB

• Distribution et réplication dans MongoDB

• MongoDB et les langages de programmation

2
BD NoSQL orientées documents
• Elles stockent une collection de documents

• Elles sont basées sur le modèle clé/valeur mais la


valeur est un document en format semi-structuré
hiérarchique de type JSON (Javascript Object
Notation) ou XML

• Les documents n’ont pas de schéma, mais une


structure arborescente

• Elles ont généralement une interface d’accès


HTTP/REST permettant d’effectuer des requêtes
(plus complexe que l’interface CRUD des BD clé/
valeurs)
3
Document
• Est la plus petite unité logique de stockage dans une
base NoSQL orientée document

• Contient une liste de champs, un champ a une valeur


qui peut être une liste de champs ….

4
Collection
lustration des modèles NoSQ
• Est une unité logique de stockage de données dans une
base NoSQL orientée document

Contient: représentation
Exemple
• un ou plusieurs documents,
de ventespas en
forcément de
document
Introduction aux bases de données non-relationnelles

même
Exemplenature ou schéma
: Représentation de ventes en document

Collection Sales
#oid
"ticket" : 1
"date" : "01/01/16"
4d040766076 "books" : [
6b236450b45
"_id" : 2212121504
a3
"_id" : 2212141556
]
"ticket" : 2
4d040766076 "date" : "01/01/16"
6b236450b45 "books" : [
a4 "_id" : 2212141556
]

Collection Book
#oid 5
Implémentations les plus courantes

• MongoDB (MongoDB, inc)

• CouchDB (Apache Foundation)

• RavenDB (pour plateforme .NET/Windows)

6
Modélisation logique et
JSON

7
Modélisation logique arborescence

• Les BD NoSQL orientées documents stockent les


données dans une structure arborescente (ou semi-
structurée)

• La représentation logique des données dans une


BD orientée document se fait grâce au format JSON

8
JSON : Definition
• Format de représentation logique de données, hérité de la
syntaxe de création d’objets en Javascript

• Format régulier (ne contient pas trop de caractères de


structuration)

• Assez facilement lisible par les humains

• Facilement parsable par les machines

Attention : JSON est indépendant de tout langage

Bien que JSON puise sa syntaxe du JavaScript, il est


indépendant de tout langage de programmation. Il peut ainsi
être interprété par tout langage à l'aide d'un parser

9
langages qui l'utilisent (sa seule fonction est d
différemment
Exemple : unpour chaque
fichier cas suivant
JSON simplele conte

Exemple : Un fichier JSON simple

1 {
2 "nom" : "Norris",
3 "prenom" : "Chuck",
4 "age" : 73,
5 "etat" : "Oklahoma"
6 }

Attention : JSON est Indépendant


Bien que JSON puise sa syntaxe du JavaS
programmation. Il peut ainsi être interpré

10
JSON : règles syntaxiques
• R1 : il ne doit exister qu'un seul élément père par document contenant tous les
autres : un élément racine

• R2 : tout fichier JSON bien formé doit être :

• soit un objet commençant par { et se terminant par },

• soit un tableau commençant par [ et terminant par ],

• soit équivalent à [] ou {}

• R3 : les séparateurs utilisés entre deux paires/valeurs sont des virgules

• R4 : un objet JSON peut contenir d'autres objets JSON

• R5 : il ne peut pas y avoir d'éléments croisés

11
Éléments JSON et Types
• Il existe deux types d’éléments :

• Des couples de type "nom": valeur, comme l'on peut en trouver dans les
tableaux associatifs.

• Des listes de valeurs, comme les tableaux utilisés en programmation

• Il existe trois types de valeurs possibles :

• Primitifs : nombre, booléen, chaîne de caractères, null.

• Tableaux : liste de valeurs (tableaux et objets aussi autorisés) entrées entre


crochets, séparées par des virgules.

• Objets : listes de couples "nom": valeur (tableaux et objets aussi autorisés)


entrés entre accolades, séparés par des virgules.

12
 Tableaux : liste de valeurs (tableaux et objets aussi autorisés) entrées entre
séparées par des virgules.
 Objets : listes de couples "nom": valeur (tableaux et objets aussi autoris
Modélisation logique avec JSON : exemple
entre accolades, séparés par des virgules.

Exemple
Gestion des cours d’une formation
1 {
2 "nom cours" : "NF29",
3 "theme" : "ingenierie documentaire",
4 "etudiants" : [
5 {
6 "nom" : "Norris",
7 "prenom" : "Chuck",
8 "age" : 73,
9 "pays" : "USA"
10 },
11 {
12 "nom" : "Doe",
13 "prenom" : "Jane",
14 "age" : 45,
15 "pays" : "Angleterre"
16 },
17 {
18 "nom" : "Ourson",
19 "prenom" : "Winnie",
20 "age" : 10,
21 "pays" : "France"
22 }
23 ]
24 }

13
Autres usages du JSON

• Chargement asynchrones de pages Web avec les


technologies telles que AJAX

• Développement d’APIs pour l’accès et le partage


de données

• Envoie de requêtes vers un SGBD et réception de


la réponse sous format JSON

14
Mise en oeuvre avec
MongoDB

15
MongoDB : présentation
• MongoDB est une BD NoSQL open source créée par
MongoDB, inc en 2008

• MongoDB stocke les données au format BSON, qui


est une version binaire de JSON

• MongoDB est la BD NoSQL orientée document la plus


utilisée dans le monde par les entreprises et les
particuliers

• C’est une BD schéma-less et une collection peut


contenir des documents de structures différentes

16
Serveur MongoDB
• Equivaut à une instance + plusieurs bases de
données

• Chaque base de données contient une ou plusieurs


collections

• Chaque collection contient un ou plusieurs document

• Chaque document est au format JSON et contient


donc des propriétés

17
Architectures possibles

• Client-serveur : accessible avec un client (p.ex. mongo


shell)

• Mode distribué sur plusieurs serveurs :


partitionnement horizontal ou sharding et accessible à
travers plusieurs couches applications (langages, API,
etc.)

18
Installation et démarrage de MongoDB

• MongoDB est multi plateforme, i.e. disponible


pour Windows, Linux et OSX

• Voir https://www.mongodb.com/docs/manual/
installation/ pour les instructions d’installation pour
chaque plateforme

• Démarrage du serveur sous Linux : sudo service


mongod start

19
Connexion à un serveur MongoDB

• En local (avec mongo shell)

• présent sur la même machine, exécuter la commande :


mongo ;

• À distance sur le port standard (avec mongo shell)

• Executer la commande : mongo --host nom-du-


serveur

• Vous pouvez aussi vous connectez au serveur MongoDB à


l’aide d’outils GUI tel que Robo 3T

20
Création et Ajout sous MongoDB

• Création d’une nouvelle BD

• use nom_base

• Création d’une nouvelle collection

• db.createCollection(‘’nom_collection’’)

• Insertion d’un nouveau document

• db.nom_collection.insert(Document JSON)

21
Lecture des données sous MongoDB

• La recherche de données dans une base MongoDB se


fait avec l’instruction :

• db.mycollection.find(Document JSON, document


JSON) avec

• le premier document JSON définit une restriction ;

• le second document JSON définit une projection


(ce second argument est optionnel).

22
Exemple de lecture avec restrictions

• Retrouver la liste des documents JSON de la


collection « etudiant » ayant à la racine un attribut
« nom »avec la valeur « Mamadou »

• db.etudiant.find({"nom":"Mamadou"})

23
Exemple de lecture avec restriction et projection

• Retrouver les documents JSON de la collection


« étudiant » ayant à la racine un attribut « nom »
avec la valeur « Mamadou » et seul les attributs
situés à la racine « nom » et « classe » sont projetés
(en plus de l’attribut _id qui est projeté par défaut)

• db.etudiant.find({"nom":"Mamadou"}, {"nom":1,
"classe":1} )

24
Mise à jour de documents
• Trois méthodes

• db.collection.updateOne(<filter>, <update>, <options>)

• d b . c o l l e c t i o n . u p d a t e M a n y ( < fi l t e r > , < u p d a t e > ,


<options>)

• db.collection.replaceOne(<filter>, <update>, <options>)

• L’opérateur MongoDB $set permet de spécifier les champs à


mettre à jour ainsi que les nouvelles valeurs.

• Attention : Une fois défini, vous ne pouvez pas mettre à jour


la valeur du champ _id ni remplacer un document existant
par un document de remplacement qui a une valeur de
champ _id différente
25
Exemple de mise à jour
• Changer la note de tous les étudiants dont le nom est « ba »en
leur attribuant une note de 15

• db.etudiant.updateMany(

{ "nom": "ba"},

$set: { "note": 15},

$currentDate: { lastModified: true }

26
Suppression de documents
• Deux méthodes

• db.collection.deleteMany()

• db.collection.deleteOne()

• Pour supprimer tous les documents d'une


collection, transmettez un document de filtre vide {}
à la méthode db.collection.deleteMany().

27
Exemple de suppression de documents

• supprimer tous les documents de la collection


« étudiant »

• db.collection.deleteMany({})

• supprimer les documents de la collection


« étudiant » dont la valeur de l’attribut est inférieur
à 10

• db.collection.deleteMany({"note": {$lt:10}})

28
Visualisation du dictionnaire de données
• On peut visualiser la liste des BD sur un serveur MongoDB
avec :

• show dbs

• On peut visualiser la liste des collections d’une BD sur un


serveur MongoDB avec ;

• show collections

• On peut voir le contenu d’une collection avec :

• db.mycoll.find()

29
Agrégats dans MongoDB
Les utilisations standards de l’agrégat incluent :

• Grouper des données par une expression donnée

• Calcul des résultats basés sur plusieurs champs et


stockage de ces résultats dans un nouveau champ

• Filtrage des données pour renvoyer un sous-


ensemble correspondant à un critère donné

• Tri des données

30
Syntaxe d’un agrégat sous MongoDB
Sous MongoDB, une agrégation est une suite
d’étapes, chacune prenant en entrée un ou plusieurs
documents. Pour créer une requête d’agrégat utiliser
la syntaxe suivante :

31
Exemple de requête d’agrégat

32
Requête d’agrégat : première étape

L'étape $project transmet les documents contenant les


champs suivants à l'étape suivante du pipeline :

• genres

• imdb

• title

Les documents de la collection qui n'incluent pas


tous ces champs ne sont pas transmis à l'étape
suivante du pipeline.

33
Requête d’agrégat : deuxième étape
L'étape $unwind transmet un document pour chaque
élément du tableau genres à l'étape suivante du pipeline.

• L'étape $unwind génère les deux documents


suivants à partir de l'exemple de document d'origine,
puis les transmet à l'étape suivante du pipeline :

34
Requête d’agrégat : troisième étape
La phase $group :

• Récupère les valeurs de genre distinctes des


documents qu'il reçoit de l'étape de pipeline
précédente

• Crée un document pour chaque genre distinct où le


_id est le nom du genre

• Ajoute un champ, averageGenreRating, à chaque


nouveau document contenant la moyenne imdb.rating
de tous les documents correspondant au genre, et

• Passe les nouveaux documents à l'étape suivante du


pipeline

35
Requête d’agrégat : troisième étape

36
Requête d’agrégat : dernière étape
L'étape $sort trie les documents qu'elle reçoit de
l'étape précédente par ordre décroissant en fonction
de la valeur du champ averageGenreRating.

37
Fonctions d’agrégation
Ceux-ci sont essentiellement utilisés dans la phase d’agrégation :

• sum

• count

• avg

• min:

• max

• first

• last

38
Distribution des données dans MongoDB
• MongoDB prend en charge la mise à l'échelle horizontale via le sharding

• Un cluster MongoDB se compose des éléments suivants :

• Shard (ou fragment) : chaque partition contient un sous-ensemble des données


partitionnées. Chaque fragment peut être déployé en tant que jeu de réplicas.

• Mongos : le mongos agit comme un routeur de requêtes, fournissant une


interface entre les applications clientes et le cluster

• Config servers : les serveurs de configuration stockent les métadonnées et les


paramètres de configuration du cluster.

• MongoDB fragmente les données au niveau «collection », en distribuant les


données de la collection entre les fragments du cluster

• MongoDB utilise la clé de partition (« shard key ») pour distribuer les documents
de la collection entre les partitions. La clé de partition consiste en un ou plusieurs
champs dans les documents.

39
Architecture d’un cluster MongoDB

40
Configuration d’un cluster MongoDB

• Activation du sharding par la commande


sh.enableSharding()

• Déploiement d’un cluster mongoDB, voir ici :


https://www.mongodb.com/docs/manual/tutorial/
deploy-shard-cluster/

41
Réplication dans MongoDB

Un «replica set » dans MongoDB est un groupe de


processus mongod qui maintiennent le même jeu
de données. Les « replica sets » offrent une
redondance et une haute disponibilité, et
constituent la base de tous les déploiements de
production.

42
Configuration de la replication dans MongoDB

Voici quelques-unes des étapes à suivre pour activer la réplication


avec MongoDB :

• Vérifier l'état de la réplication MongoDB

• Installer des instances Mongodb supplémentaires

• Démarrer chaque membre du jeu de répliques

• Lancer l'ensemble de répliques

• Ajouter des membres au jeu de répliques

• Valider que la réplication fonctionne

Pour les commandes associées, voir : https://vitalflux.com/mongodb-


how-to-enable-replication/

43
Distribution des traitements dans MongoDB
• Map-reduce prend en charge les opérations sur des collections
MongoDB partitionnées, à la fois en entrée et en sortie.

• Lors de l'utilisation d'une collection fragmentée comme entrée


pour une opération map-reduce, mongos enverra
automatiquement la tâche map-reduce à chaque fragment en
parallèle. Aucune option spéciale n'est requise. mongos
attendra la fin des travaux sur tous les fragments.

• Si le champ out pour mapReduce a la valeur sharded,


MongoDB partitionne la collection de sortie en utilisant le champ
_id comme clé de partition

44
Syntaxe de MapReduce dans MongoDB
MongoDB : MapReduce
db.runCommand(
{ mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>
[, query : <query filter object>]
[, sort : <sorts the input objects using this key. Useful for optimization, like
sorting by the emit key for fewer reduces>]
[, limit : <number of objects to return from collection>]
[, out : <see output options below>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
[, scope : <object where fields go into javascript global scope >]
[, jsMode : true]
[, verbose : true]
}
);

LI328 – Technologies Web (B. Amann) 38

45
MapReduce dans MongoDB : exemple
MapReduce : exemple
Collection de commentaires : Fonction Reduce :

{ username: "jones", likes: 20, function(key, values) {


text: "J'aime cette photo!" } var result = {count: 0, likes: 0};
values.forEach(function(value) {
Fonction Map : result.count += value.count;
result.likes += value.likes;
function() { });
emit( this.username, return result;
{count: 1, likes: this.likes} ); }
}

● Map / shuffle : [ (C,V) ] → [(C',[V'])] MapReduce incrémental


● Reduce : [ (C',[V']) ] → [ (C',V') ]

LI328 – Technologies Web (B. Amann) 39

46
Autres fonctionnalités de MongoDB

• Gestion des transactions sur la base

• Gestion de la sécurité des données

• Sauvegarde/Restauration

• Import/Export

• Indexage

• Turning

47
MongoDB et langages de programmation

• Selon Mongo Inc, MongoDB aime les


développeurs et facilitent le développement à
créer des d’applications Web sans serveur,
mobiles, d'intégration IoT ou de toute autre type
d’application imaginable.

• MongoDB supporte et fournit des bibliothèques et


drivers pour les langages suivants :

• C, C++, C#, Go, Java, Node.js, PHP, Python,


Ruby, Rust, Scala, Swift

48
Interroger MongoDB en Javascript
Le console mongo per met d’exécuter des
programme JavaScript avec instruction load.

https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell/

49
MongoDB
Mongo en
en Java Java
Connexion
1 import com. mongodb . Mongo ;
2 import com. mongodb .DB;
3 import com. mongodb . DBCollection ;
4 import com. mongodb . BasicDBObject ;
5 import com. mongodb . DBObject ;
6 import com. mongodb . DBCursor ;
7
8 Mongo m = new Mongo ();
9 // or
10 Mongo m = new Mongo ( " localhost " );
11 // or
12 Mongo m = new Mongo ( " localhost " , 27017 );
13
14 DB db = m. getDB ( " mydb " );

LI328 – Technologies Web (B. Amann)


50
MongoDB en Java
Mongo en Java
● Authentification (optionnel ):
boolean auth = db. authenticate ( myUserName , myPassword );

● Liste des collections :


Set < String > colls = db. GetCollectionNames ();
for ( String s : colls ) {
System . out . println (s); }

● Accès à une collection :


DBCollection coll = db. getCollection (" testCollection ")

LI328 – Technologies Web (B. Amann) 29

51
Mongo en Java
MongoDB en Java
● Insertion d'un objet (document) :
1 BasicDBObject doc = new BasicDBObject ();
2
3 doc . put (" name ", " MongoDB ");
4 doc . put (" type ", " database ");
5 doc . put (" count ", 1);
6
7 BasicDBObject info = new BasicDBObject ();
8
9 info . put ("x", 203);
10 info . put ("y", 102);
11
12 doc . put (" info ", info );
13
14 coll . insert ( doc );

LI328 – Technologies Web (B. Amann)


52
Mongo enenJava
MongoDB Java
● Requêtes :
1 DBObject doc = collection . findOne (); // get first document
2 System . out . println ( dbObject );

1 DBCursor cursor = collection . find ();


2 while ( cursor . hasNext ()) {
3 System . out . println ( cursor . next ()); }

1 BasicDBObject query = new BasicDBObject ();


2 query .put(" number ", 5);
3 DBCursor cursor = collection . find ( query );
4 while ( cursor . hasNext ()) {
5 System . out . println ( cursor . next ()); }

LI328 – Technologies Web (B. Amann) 31

53
Mongo en Java
MongoDB en Java
● Requêtes :
1 BasicDBObject query = new BasicDBObject ();
2 List < Integer > list = new ArrayList < Integer >();
3 list . add (9);
4 list . add (10);
5 query .put(" number ", new BasicDBObject (" $in ", list ));
6 DBCursor cursor = collection . find ( query );
7 while ( cursor . hasNext ()) {
8 System . out . println ( cursor . next ());
9}

LI328 –54
Technologies Web (B. Amann)
Mongo en Java
MongoDB en Java
● Requêtes :
1 BasicDBObject query = new BasicDBObject ();
2 query .put(" number ", new BasicDBObject (" $gt ", 5). append (" $lt ", 8));
3 DBCursor cursor = collection . find ( query );
4 while ( cursor . hasNext ()) {
5 System . out . println ( cursor . next ());
6}

● Création d'un index :

coll . createIndex (new BasicDBObject ("i", 1)); // create index on "i", ascending

LI328 – Technologies Web (B. Amann) 33


55
Références
• https://www.mongodb.com/docs/manual/

• Support de cours de Bern Amann, UPMC, LIP6,


France

• Introduction au NoSQL, Stéphane Crozat, UTC,


Master IDL

• Les bases de données NoSQL et le Big Data :


comprendre et mettre en oeuvre, Rudi Bruchez,
2iéme édition, 2015.
56

Vous aimerez peut-être aussi