MongoDB : guide pratique
Pourquoi MongoDB : guide pratique ?
MongoDB est une base de données NoSQL populaire utilisée pour stocker et gérer des données structurées, semi-structurées et non structurées. Dans un monde où les applications modernes nécessitent souvent d'avoir des données flexibles et scalables, MongoDB offre une solution performante et flexible.
Un cas d'usage concret : MongoDB est idéal pour le développement de plateformes e-commerce où il faut gérer une grande quantité de produits avec des attributs variés. En outre, son système de sharding permet un excellent escalade horizontal, ce qui est essentiel pour les applications grand public.
Prerequis
- Connaissances en JavaScript
- MongoDB installé (version 4.4 ou ultérieure)
- Node.js et npm installés (pour des projets basés sur Node.js)
Concepts fondamentaux
Collection et Document
Une collection est similaire à une table dans une base de données relationnelle. Elle contient un ensemble de documents.
// Créer une collection
db.createCollection("tâches")
Un document est un enregistrement qui ressemble à un objet JSON avec des champs et des valeurs.
// Ajouter un document à la collection
db.tâches.insertOne({
titre: "Écrire le tutoriel",
description: "Créer un guide pratique sur MongoDB",
statut: "en cours"
})
Indexation
L'indexation permet de rechercher des documents plus rapidement.
// Créer un index sur le champ 'statut'
db.tâches.createIndex({ statut: 1 })
Query et Aggregation
MongoDB offre des fonctions puissantes pour interroger et analyser les données.
// Rechercher toutes les tâches en cours
db.tâches.find({ statut: "en cours" })
// Agréger par statut
db.tâches.aggregate([
{ $group: { _id: "$statut", total: { $sum: 1 } } }
])
Mise en pratique : projet fil rouge
Mini-projet : Gestionnaire de tâches
Ce projet implémente un simple gestionnaire de tâches utilisant MongoDB et Node.js.
Étape 1 : Initialisation du projet
mkdir task-manager
cd task-manager
npm init -y
Ajoutez les dépendances nécessaires :
npm install express mongoose body-parser
Étape 2 : Configuration de MongoDB
Créez un fichier config.js pour configurer la connexion à MongoDB.
// config.js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/task-manager', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("Connected to MongoDB");
});
Étape 3 : Modèle de données
Créez un fichier models/task.js pour définir le modèle de tâche.
// models/task.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const taskSchema = new Schema({
titre: {
type: String,
required: true
},
description: {
type: String
},
statut: {
type: String,
enum: ['en cours', 'terminée'],
default: 'en cours'
}
});
module.exports = mongoose.model('Task', taskSchema);
Étape 4 : Création des routes
Créez un fichier routes/tasks.js pour définir les routes.
// routes/tasks.js
const express = require('express');
const router = express.Router();
const Task = require('../models/task');
router.get('/', async (req, res) => {
try {
const tasks = await Task.find({});
res.json(tasks);
} catch (err) {
res.status(500).json({ message: err.message });
}
});
router.post('/', async (req, res) => {
const task = new Task({
titre: req.body.titre,
description: req.body.description
});
try {
const newTask = await task.save();
res.status(201).json(newTask);
} catch (err) {
res.status(400).json({ message: err.message });
}
});
router.put('/:id', async (req, res) => {
try {
const updatedTask = await Task.findByIdAndUpdate(req.params.id, req.body, { new: true });
res.json(updatedTask);
} catch (err) {
res.status(400).json({ message: err.message });
}
});
router.delete('/:id', async (req, res) => {
try {
const deletedTask = await Task.findByIdAndDelete(req.params.id);
res.json(deletedTask);
} catch (err) {
res.status(500).json({ message: err.message });
}
});
module.exports = router;
Étape 5 : Configuration de l'application
Ajoutez les routes à votre application principale dans app.js.
// app.js
const express = require('express');
const mongoose = require('./config');
const tasksRouter = require('./routes/tasks');
const app = express();
app.use(express.json());
app.use('/tasks', tasksRouter);
app.listen(3000, () => {
console.log("Server running on port 3000");
});
Étape 6 : Tester l'application
Vous pouvez tester votre application en utilisant des outils comme Postman ou curl.
## Créer une tâche
curl -X POST http://localhost:3000/tasks -H "Content-Type: application/json" -d '{"titre": "Écrire le tutoriel", "description": "Créer un guide pratique sur MongoDB"}'
## Lister toutes les tâches
curl http://localhost:3000/tasks
Erreurs frequentes et debugging
1. Erreur : MongoError: not authorized for query on <collection>
// Mauvais
db.tâches.find({ statut: "en cours" })
// Correct
use task-manager
db.tâches.find({ statut: "en cours" })
2. Erreur : TypeError: Cannot read property 'length' of undefined
// Mauvais
const tasks = await Task.find({});
if (tasks.length) {
// Code ici
}
// Correct
const tasks = await Task.find({});
if (tasks) {
// Code ici
}
3. Erreur : ReferenceError: db is not defined
// Mauvais
db.createCollection("tâches")
// Correct
use task-manager
db.createCollection("tâches")
Pour aller plus loin
Transactions : Apprenez à utiliser les transactions pour assurer la cohérence des données.
Geospatial Queries : Explorer comment MongoDB peut être utilisé pour des recherches géospatiales.
Sharding : Découvrez comment augmenter la performance et l'échelle de votre application avec le sharding.
Défi pratique
Créez une application de gestion de contacts qui utilise MongoDB et Node.js. Les fonctionnalités devraient inclure la création, la lecture, la mise à jour et la suppression de contacts.