MongoDB - Exemples Pratiques

Découvrez comment utiliser MongoDB avec différents langages et frameworks à travers des exemples concrets.

MongoDB avec Python (PyMongo)

from pymongo import MongoClient

# Connexion
client = MongoClient('mongodb://localhost:27017/')
db = client['blog']

# Insérer un article
article = {
    'titre': 'MongoDB avec Python',
    'contenu': 'Exemple de contenu...',
    'auteur': 'Baptiste',
    'tags': ['python', 'mongodb']
}
result = db.articles.insert_one(article)

# Rechercher des articles
articles = db.articles.find({
    'tags': 'python',
    'auteur': 'Baptiste'
})

# Mise à jour
db.articles.update_one(
    {'_id': result.inserted_id},
    {'$set': {'vues': 1}}
)

# Agrégation
pipeline = [
    {'$match': {'tags': 'python'}},
    {'$group': {
        '_id': '$auteur',
        'total_articles': {'$sum': 1}
    }}
]
stats = list(db.articles.aggregate(pipeline))

MongoDB avec Node.js

const { MongoClient } = require('mongodb');

async function main() {
    const client = await MongoClient.connect(
        'mongodb://localhost:27017'
    );
    const db = client.db('ecommerce');

    // Créer un produit
    const produit = {
        nom: 'Smartphone',
        prix: 499.99,
        stock: 100
    };
    await db.collection('produits')
        .insertOne(produit);

    // Rechercher des produits
    const produits = await db.collection('produits')
        .find({ prix: { $lt: 500 } })
        .sort({ prix: -1 })
        .toArray();

    // Transaction
    const session = client.startSession();
    try {
        await session.startTransaction();

        await db.collection('produits')
            .updateOne(
                { _id: produit._id },
                { $inc: { stock: -1 } },
                { session }
            );

        await db.collection('commandes')
            .insertOne({
                produit: produit._id,
                date: new Date()
            }, { session });

        await session.commitTransaction();
    } catch (error) {
        await session.abortTransaction();
    } finally {
        await session.endSession();
    }
}

MongoDB avec Express.js

const express = require('express');
const { MongoClient } = require('mongodb');
const app = express();

app.get('/produits', async (req, res) => {
    const client = await MongoClient.connect(
        'mongodb://localhost:27017'
    );
    const db = client.db('ecommerce');

    const produits = await db.collection('produits')
        .find({})
        .toArray();

    res.json(produits);
});

app.post('/produits', async (req, res) => {
    const client = await MongoClient.connect(
        'mongodb://localhost:27017'
    );
    const db = client.db('ecommerce');

    const result = await db.collection('produits')
        .insertOne(req.body);

    res.json(result);
});

MongoDB avec Mongoose

const mongoose = require('mongoose');

// Définir un schéma
const ProduitSchema = new mongoose.Schema({
    nom: { type: String, required: true },
    prix: { type: Number, min: 0 },
    stock: { type: Number, default: 0 },
    categorie: String,
    created_at: {
        type: Date,
        default: Date.now
    }
});

// Méthodes personnalisées
ProduitSchema.methods.diminuerStock =
async function(quantite) {
    this.stock -= quantite;
    return this.save();
};

const Produit = mongoose.model('Produit',
    ProduitSchema);

// Utilisation
async function main() {
    const produit = new Produit({
        nom: 'Laptop',
        prix: 999.99,
        stock: 50
    });

    await produit.save();
    await produit.diminuerStock(1);
}

Exemples d'agrégation avancée

// Statistiques de ventes par catégorie et mois
db.ventes.aggregate([
    {
        $match: {
            date: {
                $gte: new Date('2024-01-01'),
                $lt: new Date('2025-01-01')
            }
        }
    },
    {
        $group: {
            _id: {
                mois: { $month: '$date' },
                categorie: '$categorie'
            },
            total_ventes: { $sum: '$montant' },
            nb_ventes: { $sum: 1 },
            panier_moyen: {
                $avg: '$montant'
            }
        }
    },
    {
        $project: {
            mois: '$_id.mois',
            categorie: '$_id.categorie',
            total_ventes: 1,
            nb_ventes: 1,
            panier_moyen: {
                $round: ['$panier_moyen', 2]
            }
        }
    },
    {
        $sort: {
            mois: 1,
            total_ventes: -1
        }
    }
])