1 / 20

MongoDB CRUD Operations

Maîtriser les opérations fondamentales

Module NoSQL - École d'Ingénieurs

Agenda

🏗️ Introduction

Structure des documents BSON

➕ Create

Insertion de documents

📖 Read

Requêtes et projections

✏️ Update

Modification de documents

🗑️ Delete

Suppression de documents

🚀 Avancé

Cas pratiques et bonnes pratiques

📊 Introduction

Structure des données MongoDB

BSON vs JSON

JSON

  • Format texte
  • Types limités
  • Lisible par l'humain
  • Standard web

BSON

  • Format binaire
  • Types étendus (Date, ObjectId, Binary...)
  • Plus performant
  • Format de stockage MongoDB
{
  "_id": ObjectId("507f1f77bcf86cd799439011"),
  "date": ISODate("2024-03-20"),
  "price": NumberDecimal("29.99")
}

Notre cas d'usage : E-commerce Marocain

// 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"
  }
}

➕ CREATE

Insertion de documents

insertOne()

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()
})
{ "acknowledged": true, "insertedId": ObjectId("65f8a2b3c4d5e6f7a8b9c0d1") }

insertMany()

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é

📖 READ

Lecture et requêtes

find() - Requêtes de base

// 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érateurs de comparaison

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 } 
})

Requêtes sur documents imbriqués

// 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

Projections

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 }
)
{ "name": "Caftan Premium", "price": { "amount": 2500, "currency": "MAD" } } { "name": "Djellaba Moderne", "price": { "amount": 1200, "currency": "MAD" } }

✏️ UPDATE

Modification de documents

updateOne() et opérateurs

Opérateurs de mise à jour

  • $set - Définir une valeur
  • $inc - Incrémenter
  • $push - Ajouter à un tableau
  • $pull - Retirer d'un tableau
  • $unset - Supprimer un champ
db.products.updateOne(
  { sku: "CAF-001" },
  { 
    $set: { 
      "price.amount": 2800 
    },
    $push: { 
      tags: "bestseller" 
    }
  }
)

Mises à jour avancées

// 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

🗑️ DELETE

Suppression de documents

Opérations de suppression

// 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"
})

⚠️ Attention

Les suppressions sont définitives ! Pas de corbeille dans MongoDB.

Cas pratique : Processus de commande

// 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 } }
  )
}

Bonnes pratiques MongoDB

✅ À faire

  • Utiliser des projections
  • Créer des index appropriés
  • Valider les données
  • Utiliser des noms cohérents
  • Gérer les erreurs

❌ À éviter

  • Documents > 16MB
  • Trop d'imbrication (> 100)
  • Requêtes sans filtre
  • Updates sans condition
  • Ignorer les index

🎯 Objectif: Performance, scalabilité et maintenabilité