API REST Node.js/Express/MongoDB pour la Gestion de Produits. Ce TP permettra de mettre en pratique la connexion à MongoDB, l'utilisation d'Express.js pour les routes REST, l'asynchronisme en Node.js, ainsi que les requêtes avancées de MongoDB (pagination, filtrage, recherche, tri) et quelques notions sur le framework d'aggregation.
tp-mongodb-api). npm init -y.npm install express mongodb dotenv
npm install -D nodemon # Pour le développement
server.js, .env (pour la chaîne de connexion
MongoDB).MongoClient)."start": "nodemon server.js" dans package.json).
seedProducts.js.https://dummyjson.com/products (utiliser fetch
ou axios).products existante (pour un seed propre).products (utiliser
insertMany).package.json : "seed": "node seedProducts.js".C'est la partie principale du TP, couvrant les exigences de filtrage/tri/pagination.
/api/products) L'objectif est que l'endpoint réponde à une requête de type :
GET /api/products?page=2&limit=10&category=smartphones&search=iphone&sort=price
Créer le fichier routes/products.js et définir la route
GET /.
Implémenter le Contrôleur de Produits (Logique de Base) :
Extraire les paramètres de requête (req.query : page, limit,
category, search, sort).
Définir les valeurs par défaut (ex: page=1, limit=10).
Construction de la Requête MongoDB :
Filtrage par Catégorie : Ajouter à la clause $match si
category est présent.
Recherche par Titre/Description : Utiliser l'opérateur $or avec des
expressions régulières ($regex, option i pour insensible à la casse) sur
les champs title et description si search est présent.
Tri (sort) : Utiliser la méthode .sort({ price: order })
avec 1 ou -1 en fonction du paramètre sort (ex:
sort=price pour croissant, sort=-price pour décroissant).
Implémentation de la Pagination :
Calculer le nombre d'éléments à sauter : skip = (page - 1) * limit.
Appliquer .skip(skip) et .limit(limit).
Réponse Complète :
$match (pour calculer le nombre total de pages).L'objectif est d'ajouter un nouvel endpoint : GET /api/products/stats. Ce endpoint utilisera le
pipeline d'agrégation pour répondre à plusieurs questions business.
GET /api/products/stats.
Exercice 6.1 : Calcul des Statistiques Globales par Catégorie (Stades $group et
$project)
Objectif : Retourner, pour chaque catégorie de produit :
$group : Regrouper par le champ category. Utiliser les accumulateurs
$sum, $avg, $max, $min.$sort : Trier les résultats par prix moyen décroissant.$project : Renommer les champs pour la clarté (ex: _id devient
categoryName, $avgPrice devient averagePrice).Exercice 6.2 : Recherche des Meilleurs/Pires Produits par Notation (Stades $sort et
$limit)
Objectif : Trouver les 5 produits les mieux notés (rating) qui ont également un prix supérieur à 500$.
$match : Filtrer pour garder uniquement les produits avec price supérieur à
500.$sort : Trier par le champ rating en ordre décroissant.$limit : Limiter le résultat aux 5 premiers documents.$project : Inclure seulement les champs title, price et
rating.Exercice 6.3 : Décomposition par Marque et Prix Total (Stades $unwind et
$group - Avancé)
Note: La structure des données de dummyjson n'est pas optimale pour le $unwind, mais on peut
simuler un cas d'usage avec le champ brand.
Objectif : Déterminer, pour chaque marque (brand), le
stock total et la valeur totale du stock (somme de
price * stock).
$group : Regrouper par brand.$sum deux fois :totalStock (accumuler le champ stock).totalValue (utiliser l'opérateur $multiply à l'intérieur de
l'accumulateur $sum: $sum: { $multiply: ["$price", "$stock"] }).