MongoDB - Concepts Avancés

Découvrez les fonctionnalités avancées de MongoDB pour construire des applications robustes et scalables.

Framework d'Agrégation

// Pipeline d'agrégation complexe
db.ventes.aggregate([
    // Filtrer les ventes de 2024
    {
        $match: {
            date: {
                $gte: new Date('2024-01-01'),
                $lt: new Date('2025-01-01')
            }
        }
    },
    // Grouper par mois et catégorie
    {
        $group: {
            _id: {
                mois: { $month: "$date" },
                categorie: "$categorie"
            },
            total: { $sum: "$montant" },
            nbVentes: { $count: {} }
        }
    },
    // Trier par mois et total
    {
        $sort: {
            "_id.mois": 1,
            "total": -1
        }
    }
])

Opérateurs d'agrégation courants

  • $match - Filtre les documents
  • $group - Regroupe les documents
  • $project - Sélectionne ou transforme les champs
  • $lookup - Effectue une jointure avec une autre collection
  • $unwind - Décompose un tableau en documents individuels

Transactions

// Démarrer une session
const session = db.getMongo().startSession();

try {
    // Démarrer une transaction
    session.startTransaction();

    // Opérations dans la transaction
    db.comptes.updateOne(
        { _id: compte1Id },
        { $inc: { solde: -100 } },
        { session }
    );

    db.comptes.updateOne(
        { _id: compte2Id },
        { $inc: { solde: 100 } },
        { session }
    );

    // Valider la transaction
    session.commitTransaction();
} catch (error) {
    // Annuler en cas d'erreur
    session.abortTransaction();
} finally {
    session.endSession();
}

Sharding

// Activer le sharding sur une base
sh.enableSharding("maBase")

// Définir une clé de sharding
sh.shardCollection(
    "maBase.maCollection",
    { champCle: "hashed" }
)

// Vérifier le statut
sh.status()

Architecture Sharding

  • mongos (routeur)
  • Config servers
  • Shard servers

Index avancés

Index géospatiaux

// Créer un index 2dsphere
db.lieux.createIndex(
    { location: "2dsphere" }
)

// Recherche par proximité
db.lieux.find({
    location: {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [-73.9667, 40.78]
            },
            $maxDistance: 1000
        }
    }
})

Index textuels

// Créer un index textuel
db.articles.createIndex(
    { titre: "text", contenu: "text" }
)

// Recherche plein texte
db.articles.find({
    $text: {
        $search: "mongodb nosql",
        $language: "french"
    }
})

Réplication

Configuration ReplicaSet

// Initialiser un replica set
rs.initiate({
    _id: "monReplicaSet",
    members: [
        { _id: 0, host: "srv1:27017" },
        { _id: 1, host: "srv2:27017" },
        { _id: 2, host: "srv3:27017" }
    ]
})

// Vérifier le statut
rs.status()

Options de lecture/écriture

// Lecture depuis secondaire
db.collection.find().readPref("secondary")

// Écriture avec majorité
db.collection.insertOne(
    { doc: 1 },
    { writeConcern: { w: "majority" } }
)