0% ont trouvé ce document utile (0 vote)
140 vues31 pages

Introduction à MongoDB et NoSQL

Ce document introduit MongoDB, une base de données NoSQL populaire. Il présente les concepts clés de MongoDB tels que les documents, les collections et les propriétés. Le document décrit également l'installation et l'utilisation de MongoDB avec Node.js.

Transféré par

sunnybluepro
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
140 vues31 pages

Introduction à MongoDB et NoSQL

Ce document introduit MongoDB, une base de données NoSQL populaire. Il présente les concepts clés de MongoDB tels que les documents, les collections et les propriétés. Le document décrit également l'installation et l'utilisation de MongoDB avec Node.js.

Transféré par

sunnybluepro
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

3IN017 – TECHNOLOGIES DU

WEB
MongoDB

21 mars 2023

Gilles Chagnon
Plan

Cours précédents côté client, puis côté serveur, puis échanges entre client et
serveur.
Mais où est la source des données ? Il nous faut une base de données pour les
stocker...

1 Bases de données NoSQL


2 Introduction à MongoDB
3 MongoDB – Installation, lancement et surveillance
4 Utilisation avec Node.js
5 Pour le projet...

L3 Info – 3IN017 1/1


Bases de données NoSQL
NoSQL – Historique

Historique

→ NoSQL : Not Only SQL


→ 2004 : Big Table Google
→ 2008 : Cassandra Facebook
→ 2009 : lancement d’une communauté de développement logiciels open
source NoSQL

Spécificités

→ Manipulation de données peu (pas) structurées, schéma flexible, sans


modèle pré-défini
→ Manipulation de données volumineuses
→ Haute disponibilité
→ Capacités élevées de lectures/écritures

L3 Info – 3IN017 2/1


NoSQL

NoSQL
NoSQL (Not Only SQL), apparu en 2009, et comme son nom l’indique une
alternative au langage SQL et au modèle relationnel de base de données que
vous avez l’habitude d’utiliser. L’idée est de proposer une architecture souple et
puissante avec une forte disponibilité et de faibles contraintes.

Particulièrement à la mode, la majorité des grandes entreprises du web


abandonnent leurs bases de données traditionnelles et portent leur propre projet
NoSQL : Facebook et Twitter utilisent Cassandra (de la Fondation Apache),
Amazon SimpleDB, LinkedIn Voldemort, etc.

L3 Info – 3IN017 3/1


Théorème CAP
Propriétés fondamentales pour les systèmes distribués
→ Coherence : tous les noeuds du système voient exactement les mêmes
données au même moment
→ Availability (Disponibilité) : garantie que toutes les requêtes reçoivent une
réponse ;
→ Partition tolerance (Résistance au partitionnement) : sauf coupure totale
du système, aucune panne ne peut empêcher le système de fonctionner
normalement
Dans un système distribué, seules deux propriétés sur trois peuvent être
assurées à un instant t.
Exemples (wikipedia)
Soit A et B deux utilisateurs, soit N1 et N2 deux noeuds.
• Si A modifie une valeur sur N1, alors pour que B voie cette valeur sur N2 il
faut attendre que N1 et N2 soient synchronisés (cohérence).

Exemple d’arbitrage : deux utilisateurs qui font une même recherche peuvent
obtenir des résultats différents, mais cet inconvénient est moins grave que de
ne pas avoir de résultats du tout.
L3 Info – 3IN017 4/1
NoSQL

L3 Info – 3IN017 5/1


Introduction à MongoDB
MongoDB

MongoDB (Wikipédia)
MongoDB est un système de gestion de base de données :
→ orientée documents,
→ plus libre (changement de licence),
→ montant bien en puissance (scalable),
→ à performance raisonnable,
→ ne nécessitant pas de schéma prédéfini des données,
→ écrit avec le langage de programmation C++.
Il fait partie de la mouvance NoSQL et vise à fournir des fonctionnalités
avancées. Utilisée par Foursquare, bit.ly, Doodle, Disqus

L3 Info – 3IN017 6/1


MongoDB

Drivers
→ C
→ C++
→ Erlang
→ Haskell
→ Java
→ Javascript
→ .NET (C# F#, PowerShell, etc)
→ Perl
→ PHP
→ Python
→ Ruby
→ Scala

L3 Info – 3IN017 7/1


MongoDB : Principes

→ Une instance de Mongodb peut contenir une ou plusieurs bases de données


→ Une base de données peut avoir une ou plusieurs collections
→ Équivalent des tables dans les bases classiques
→ Une collection peut avoir de zéro à plusieurs documents
→ Les documents d’une même collection n’ont pas obligatoirement le même
« schéma » (les mêmes champs)
→ Les documents correspondent aux enregistrements (tuples)
→ Des documents peuvent contenir des documents (structure hiérarchique)
→ Chaque document possède une clef unique
→ MongoDB stocke l’information au format BSON (Binary JSON)

L3 Info – 3IN017 8/1


MongoDB : Propriétés

Avantages
→ Requêtes « faciles »
→ Fait sens avec la plupart des applications Web
→ Facilité d’intégration des données

Inconvénients
Pas bien adapté pour les systèmes transactionnels complexes

L3 Info – 3IN017 9/1


MongoDB – Document (1)

Un document (= un objet JavaScript) :

user = {
name: "Dupont",
occupation: "détective",
location: "Moulinsart"
}

L3 Info – 3IN017 10/1


MongoDB – Document (2)

Un autre document :

{
"name": " John Smith ",
"address": {
"street": " Lily Road ",
"number": 32,
"city": " Owatonna ",
"zip": 55060
},
"hobbies": [ "yodeling", "ice skating" ],
"bearded": true
}

L3 Info – 3IN017 11/1


MongoDB – Collection

Une collection :
{ "_id": ObjectId("4efa8d2b7d284dad101e4bc9"),
"Last Name": "Térieur",
"First Name": "Alex",
"Date of Birth": "1980-5-24"
},
{ "_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "Térieur",
"First Name": "Alain",
"Date of Birth": "1981-6-25",
"Address": "7 rue des Preuves, 24130 la Force"
}

L3 Info – 3IN017 12/1


Imaginons que l’on veuille modéliser un blog :

Mauvais design
post = {
id: 150,
author: 100,
text: "This is a pretty awesome post",
comments: [100, 105, 112]
}
author = {
id: 100,
name: "Jessica Sroll",
posts: [150]
}
comment = {
id: 105,
text: "Intéressant point de vue"
}

L3 Info – 3IN017 13/1


MongoDB

Autre design
post = {
author: "Jessica Sroll",
text: "This is a pretty awesome post",
comments: [
"Intéressant point de vue",
"Tout à fait d'accord"
]
}

Pourquoi celui-ci est-il meilleur ?

L3 Info – 3IN017 14/1


MongoDB – Installation, lancement et
surveillance
Installation et lancement

→ Installation par un simple npm install mongodb


→ Lancement :
→ en ligne de commande en tapant mongod qui lance le démon
→ ou comme un service (avec systemd, sudo systemctl start mongodb

Le serveur est accessible à l’adresse mongodb://localhost:27017.

L3 Info – 3IN017 15/1


Mongo shell

La commande mongosh ou mongo permet d’accéder à un environnement (en


ligne de commande) pour réaliser un certain nombre d’opérations. Outre les
commandes node que nous verrons plus loin, il y a aussi :

→ db pour afficher la base de données courante (par défaut test)


→ show dbs pour afficher la liste des bases de données du serveur
→ use db_name pour utiliser la base db_name. Si cette base n’existe pas, elle
est créée.
→ une fois une base nommée db_name sélectionnée, on peut la supprimer
avec dropDatabase()
→ show collections pour afficher la liste des collections de la base courante
→ db.getCollectionInfos() affiche des informations sur les collections de
la base courante
→ pour supprimer la collection col1 de la base courante, il faut saisir
db.col1.drop()

L3 Info – 3IN017 16/1


En résumé...

1 Installation avec npm install mongodb


2 Lancement du serveur avec mongod
3 Éventuellement monitoring du serveur avec mongosh

L3 Info – 3IN017 17/1


Utilisation avec Node.js
Connexion au serveur MongoDB local
const {MongoClient} = require('mongodb');

async function main(){


// URI de connexion. À modifier si on n'est pas en local
const uri = "mongodb://localhost";
const client = new MongoClient(uri);

try {
// Connexion au serveur
await client.connect();

// ici le code à exécuter...


await faisCi(client);
await faisCa(client);

} catch (e) {
// si une des promesses n'est pas réalisée
console.error(e);
} finally {
// une fois que tout est terminé, on ferme la connexion
await client.close();
}
}
// main est une promesse, donc peut afficher un message en cas d'échec
main().catch(console.error);
L3 Info – 3IN017 18/1
Accès aux bases et aux collections

→ Accès à la base base1 : après await client.connect(), donc une fois


connecté, il suffit d’écrire client.db("base1");
→ Accès à la collection collec1 de la base1 :
client.db("base1").collection("collec1");, ou, mieux,
const col1 = await client.db("base1").collection("collec1");
Si cette collection n’existe pas, elle est créée.

L3 Info – 3IN017 19/1


Création de document(s)

→ Création d’un document (= ajout à une collection) : insertOne()


//newDoc est un objet JavaScript
const res1 = await
,→ client.db("base1").collection("collec1").insertOne(newDoc);
→ Création de plusieurs documents : insertMany()
//newDocs est un tableau d'objets JavaScript
const resBeaucoup = await
,→ client.db("base1").collection("collec1").insertMany(newDocs);

L3 Info – 3IN017 20/1


Lecture d’un document

Avec findOne() appliquée à la collection choisie. Cette méthode prend un


paramètre facultatif permettant de restreindre la recherche. findOne() renvoie
le premier document répondant aux critères de recherche. Par exemple...
/* renvoie le 1er document de la collection collec1 possédant une
propriété valeurNum dont la valeur est supérieure ou égale à 50
et une propriété de type booléen valant true */
const res1 = await
client.db("base1").collection("collec1").findOne(
{
valeurNum: {$gte: 50},
valeurBool: {$eq: true}
}
);
Voir la liste des filtres possibles :
https://www.mongodb.com/docs/manual/reference/operator/
query-comparison/

L3 Info – 3IN017 21/1


Lecture de plusieurs documents

Avec findMany() appliquée à la collection choisie. Cette méthode prend un


paramètre facultatif permettant de restreindre la recherche. findMany()
renvoie un « curseur » répondant aux critères de recherche. Par exemple...
/* renvoie un curseur pointant vers les documents de la
collection collec1 possédant une propriété valeurNum dont la
valeur est supérieure ou égale à 50 et une propriété de type
booléen valant true */
const cursor2 = await
client.db("base1").collection("collec1").findMany(
{
valeurNum: {$gte: 50},
valeurBool: {$eq: true}
}
);
// On transforme cursor2 en Array pour l’exploiter...
const result2 = await cursor2.toArray();
Des méthodes de traitement sont disponibles pour le curseur :
https:
//mongodb.github.io/node-mongodb-native/3.6/api/Cursor.html
L3 Info – 3IN017 22/1
Mise à jour

Pour mettre à jour un document, on utilise updateOne(), qui prend un filtre


(éventuellement vide) en premier paramètre, et la valeur de remplacement en
deuxième. Par exemple...
const res1 = await
client.db("base1").collection("collec1").updateOne(
{
valeurNum: {$gte: 50}
},
{
$set: doc2
}
);
doc2 ne remplace pas le 1erdocument répondant au filtre ; mais ses propriétés
viennent compléter ou remplacer celles de ce premier document portant le
même nom ou n’étant pas renseignées.
On procède de manière similaire avec updateMany().

L3 Info – 3IN017 23/1


Suppression

Sur le même principe de fonctionnement que findOne ou updateOne d’une


part, findMany ou updateMany d’autre part avec le recours à des filtres, on
peut supprimer un ou des documents avec respectivement deleteOne() et
deleteMany()

L3 Info – 3IN017 24/1


Pour le projet...
Pour le projet
→ Module NodeJS : netdb
→ Documentation : https://github.com/louischatriot/nedb/
→ Sous-ensemble de l’API MongoDB utilisable sans serveur MongoDB
→ Plus simple qu’installer le serveur : stockage dans la mémoire
→ Uniquement pour les cours : plus maintenu ! ! !
Si vous utilisez votre propre machine, vous pouvez installer MongoDB mais
dans tous les cas il faudra fournir aux enseignants de quoi créer les bases de
données avec des données suffisantes pour pouvoir vérifier le bon
fonctionnement de votre code (par exemple via un service populateDatabase,
ou au lancement du serveur).

Regardons la doc ensemble !

En vrai
→ Vraie connexion à un vrai serveur
→ Nécessite de gérer un serveur

L3 Info – 3IN017 25/1

Vous aimerez peut-être aussi