Retour au cours

Semaines 8-10 : NoSQL

Quand le relationnel ne suffit plus : documents, clés-valeurs et graphes pour des données à géométrie variable

Objectifs des semaines 8 à 10

À la fin de ces deux semaines, vous saurez reconnaître les quatre familles de bases de données NoSQL (clé-valeur, document, graphe, colonne) et choisir quand elles valent mieux que le relationnel, parler le vocabulaire de MongoDB (collection, document), installer Node.js et écrire un premier script puis un serveur HTTP, brancher Node sur PostgreSQL puis sur MongoDB, programmer un DAO Mongo qui liste, cherche et ajoute des documents, calculer des statistiques avec le pipeline d'agrégation, et garder des données locales avec LocalStorage.

Déroulement

  1. Les familles NoSQL : clé-valeur, document, graphe, colonne et multi-modèle. Ce qu'on gagne (souplesse, échelle) et ce qu'on lâche (les jointures, une partie d'ACID).
  2. La nomenclature : la table devient une collection, la rangée devient un document, et un document ressemble à un objet JavaScript en JSON.
  3. Node.js : installation, node allo.js, puis un serveur HTTP qui répond sur localhost:3000.
  4. Node et la base : d'abord PostgreSQL avec le module pg, ensuite MongoDB avec le pilote officiel : find, insertOne, puis l'agrégation avec $group.
  5. Données locales : LocalStorage pour garder des préférences ou un cache côté client, le premier pas vers le Projet Bestiaire.

La nomenclature et trois extraits à garder sous la main

On ne nomme pas les choses de la même manière selon la technologie :

TechnologieGroupe de donnéesUne seule donnée
SQLTABLEENREGISTREMENT (rangée)
NoSQLCOLLECTIONDOCUMENT
Java / JavaScriptLISTE d'objetsOBJET
1Le serveur HTTP minimal
const http = require('http');
const adresse = '127.0.0.1';
const port = 3000;
const serveur = http.createServer((requete, reponse) => {
    reponse.statusCode = 200;
    reponse.setHeader('Content-Type', 'text/plain');
    reponse.end('Hello World\n');
});
serveur.listen(port, adresse, () => {
    console.log(`Serveur à http://${adresse}:${port}/`);
});
2Lire une collection Mongo
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017/";

async function listerOiseaux() {
    const client = new MongoClient(uri);
    await client.connect();
    const oiseaux = await client.db("local")
        .collection("oiseau").find({}).toArray();
    console.log(oiseaux);
    client.close();
}
listerOiseaux();
3L'agrégation : statistiques par marque
db.telephone.aggregate([
    { $group: {
        _id: "$marque",
        nombre: { $sum: 1 },
        prixMoyen: { $avg: "$montant" }
    } }
]);
// les valeurs numériques s'insèrent sans guillemets,
// sinon $sum et $avg ne les additionnent pas
Avant d'installer quoi que ce soit : npm install mongodb dans le répertoire du projet, et un serveur MongoDB qui écoute sur le port 27017 (local) ou une grappe MongoDB Atlas dont vous collez l'adresse mongodb+srv://.

Notes de cours

Les diaporamas des semaines 8 à 10, en version web (diapositives d'origine, exactes) et en PDF :

Comprendre le NoSQL

Bases de données NoSQL 27 diapositives - les quatre familles et le multi-modèle
Nomenclature : SQL, NoSQL et objets 2 diapositives - table, collection, liste d'objets
Qu'est-ce que le NoSQL, par Amazon Web Services

Tester son installation Node.js : deux jeux à télécharger et compiler

Sur Kubuntu 24.04, installez d'abord Node.js 22 LTS directement par apt (dépôt officiel NodeSource) :

sudo apt update && sudo apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node -v

Puis téléchargez l'un de ces deux jeux (livrés sans node_modules/) pour tester l'installation des dépendances et la compilation :

unzip pirate-sql.zip && cd pirate-sql
npm install        # télécharge et installe node_modules/
npm run dev        # lance le jeu en développement ( ou ./start.sh )
npm run build      # compile le projet dans dist/
npm run preview    # teste la version compilée

Node.js

Node.js : introduction 40 diapositives - idée générale, installation, premiers scripts
Node.js : serveur HTTP 25 diapositives - un programme qui répond au fureteur
Node.js : accès à une base de données 14 diapositives - Node et PostgreSQL avec le module pg

Programmer MongoDB

Programmation Mongo en JavaScript 47 diapositives - le coeur de la matière : projet, connexion, CRUD, oiseaux
Agrégation MongoDB 17 diapositives - $group, $sum, $avg sur les téléphones

Programmation des données en Node

Accesseurs Node.js 2 diapositives - les tutoriels de référence
Programmation LocalStorage 12 diapositives - des données locales pour les oiseaux préférés

Le code du cours

Les scripts montrés en classe, à lancer avec node nom-du-fichier.js dans un projet où le pilote est installé.

Premiers pas

Scripts Node allo.js allo-toi.js allo-data.js (lire une collection) Jeux pour tester Node.js pirate-sql.zip sql-city-builder.zip

Le DAO Mongo, en trois temps

MongoDAO sans classe en classe le test

L'exercice Oiseaux : un exemple complet

Projet Oiseaux oiseau-du-monde.zip oiseau-du-monde-en-cours.zip oiseau-du-monde-solution.zip
Dépannage sur Ubuntu 24.04 (EliteBook G11, Node 22, noyau 6.14) : si npm run start sur le projet Oiseaux donne l'erreur fatal: the suid sandbox helper binary was found, but is not configured correctly (causée par la restriction d'Ubuntu 24.04 sur les espaces de noms utilisateurs non privilégiés de chrome-sandbox), désactivez temporairement cette restriction pour démarrer immédiatement :
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

Ressources

Carte de référence MongoDB (PDF) Documentation MongoDB le manuel le pilote Node.js l'agrégation Node.js télécharger la documentation MongoDB Atlas (grappe gratuite en ligne) LocalStorage sur MDN (en français)

Évaluation : le Projet Bestiaire (25 %)

Le devoir des semaines 8 à 12 : une application Node et MongoDB qui gère un bestiaire, avec ses tutoriels (commandes importantes, l'application, les données locales). L'exercice Oiseaux ci-dessus en est la répétition générale. Tout le projet est sur sa propre page : le Projet Bestiaire.

Tout ce que vous apprenez ces deux semaines sert directement le Bestiaire : la nomenclature, le DAO Mongo, l'agrégation pour les statistiques et LocalStorage pour les données locales.

En savoir plus

Pour aller plus loin et comparer avec l'écosystème Java : les diapositives et le projet Eclipse avec le pilote officiel MongoDB pour Java.

Programmation NoSQL en Java 43 diapositives - la même chose avec le pilote Java, en complément