Maîtriser les opérations fondamentales
Module NoSQL - École d'Ingénieurs
Structure des documents BSON
Insertion de documents
Requêtes et projections
Modification de documents
Suppression de documents
Cas pratiques et bonnes pratiques
Structure des données MongoDB
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"date": ISODate("2024-03-20"),
"price": NumberDecimal("29.99")
}
// Collection: products
{
"sku": "CAF-001",
"name": "Caftan Premium",
"price": {
"amount": 2500,
"currency": "MAD"
},
"stock": {
"quantity": 15,
"warehouse": "Casablanca"
}
}
// Collection: customers
{
"customerId": "CLT-10234",
"firstName": "Fatima",
"lastName": "Benali",
"address": {
"city": "Rabat",
"country": "Maroc"
}
}
Insertion de documents
Insérer un seul document dans une collection
db.products.insertOne({
sku: "THE-001",
name: "Thé à la menthe - Boîte luxe",
category: "Alimentation",
price: {
amount: 150,
currency: "MAD"
},
createdAt: new Date()
})
Insérer plusieurs documents en une seule opération
db.customers.insertMany([
{
customerId: "CLT-10235",
firstName: "Mohammed",
lastName: "Alaoui",
email: "m.alaoui@email.com"
},
{
customerId: "CLT-10236",
firstName: "Amina",
lastName: "Rachidi",
email: "amina.r@email.com"
}
])
💡 Tip: MongoDB génère automatiquement un _id unique si non spécifié
Lecture et requêtes
// Tous les documents
db.products.find()
// Avec filtre
db.products.find({ category: "Vêtements" })
// Avec limite
db.products.find().limit(5)
// Un seul document
db.products.findOne({ sku: "CAF-001" })
find() retourne un cursor qu'on peut parcourir
| Opérateur | Description | Exemple |
|---|---|---|
| $gt | Greater than | { price: { $gt: 1000 } } |
| $gte | Greater than or equal | { price: { $gte: 1000 } } |
| $lt | Less than | { stock: { $lt: 10 } } |
| $in | In array | { city: { $in: ["Rabat", "Casa"] } } |
// Produits entre 500 et 2000 MAD
db.products.find({
"price.amount": { $gte: 500, $lte: 2000 }
})
// Notation point pour accéder aux champs imbriqués
db.customers.find({
"address.city": "Casablanca"
})
// Requêtes sur tableaux
db.products.find({
tags: "traditionnel"
})
// Tableau contenant TOUS ces éléments
db.products.find({
tags: { $all: ["traditionnel", "luxe"] }
})
⚠️ Important: Utilisez des guillemets pour les chemins avec points
Sélectionner uniquement les champs nécessaires
// Inclure des champs spécifiques
db.products.find(
{ category: "Vêtements" },
{ name: 1, price: 1, _id: 0 }
)
// Exclure des champs
db.customers.find(
{},
{ loyaltyPoints: 0, preferences: 0 }
)
Modification de documents
db.products.updateOne(
{ sku: "CAF-001" },
{
$set: {
"price.amount": 2800
},
$push: {
tags: "bestseller"
}
}
)
// Mise à jour avec upsert
db.products.updateOne(
{ sku: "NEW-001" },
{
$set: { name: "Nouveau Produit" },
$setOnInsert: { createdAt: new Date() }
},
{ upsert: true }
)
// Mise à jour de tableaux avec positional operator
db.orders.updateOne(
{ "items.sku": "CAF-001" },
{ $inc: { "items.$.quantity": 1 } }
)
Le $ représente le premier élément correspondant du tableau
Suppression de documents
// Supprimer un document
db.products.deleteOne({ sku: "OLD-001" })
// Supprimer plusieurs documents
db.products.deleteMany({
"stock.quantity": 0
})
// Supprimer et retourner le document
const deleted = db.products.findOneAndDelete({
sku: "TEMP-001"
})
Les suppressions sont définitives ! Pas de corbeille dans MongoDB.
// 1. Vérifier le stock
const product = db.products.findOne({ sku: "CAF-001" })
if (product.stock.quantity > 0) {
// 2. Créer la commande
db.orders.insertOne({ /* order details */ })
// 3. Mettre à jour le stock
db.products.updateOne(
{ sku: "CAF-001" },
{ $inc: { "stock.quantity": -1 } }
)
// 4. Mettre à jour les points fidélité
db.customers.updateOne(
{ customerId: "CLT-10234" },
{ $inc: { loyaltyPoints: 100 } }
)
}
🎯 Objectif: Performance, scalabilité et maintenabilité