Interagir avec MongoDB - CRUD, mongosh & Python

@joekakone

Joseph Konka @joekakone

03/03/2026 · 15 min

Maîtrisez les opérations fondamentales CRUD dans MongoDB. Apprenez à manipuler les documents BSON avec le shell mongosh, les interfaces graphiques (Compass, DBeaver) et le pilote PyMongo.

Interagir avec MongoDB : CRUD, mongosh et Python#

Une fois votre serveur MongoDB déployé, l'étape suivante consiste à maîtriser les opérations fondamentales de manipulation de données, regroupées sous l'acronyme CRUD (Create, Read, Update, Delete).

Dans ce chapitre, nous allons étudier en détail les instructions du shell interactif mongosh, explorer l'utilisation d'outils graphiques comme DBeaver et MongoDB Compass, puis concevoir un script d'automatisation en Python avec le pilote officiel PyMongo.


1. Commandes d'administration de base dans mongosh#

Pour débuter, connectez-vous au shell interactif :

docker exec -it analytics-mongo-1 mongosh -u admin -p Password123 --authenticationDatabase admin

Dans MongoDB, les bases de données et les collections sont créées de manière paresseuse (lazy creation) : elles n'apparaissent physiquement sur le disque que dès l'insertion du tout premier document.

// 1. Lister les bases de données existantes
show dbs

// 2. Basculer sur une nouvelle base (ex: 'catalogue_db')
use catalogue_db

// 3. Vérifier la base active
db.getName()

// 4. Lister les collections de la base active
show collections

2. Opérations CRUD en console mongosh#

C — CREATE : Insertion de documents#

MongoDB fournit deux méthodes principales d'insertion : insertOne() et insertMany().

// Insertion d'un document unitaire
db.produits.insertOne({
    reference: "LAPTOP-01",
    nom: "MacBook Pro 16",
    categorie: "Informatique",
    prix: 2499.00,
    en_stock: true,
    tags: ["apple", "laptop", "m3"],
    caracteristiques: {
        ram_go: 36,
        stockage_go: 512,
        couleur: "Gris Sidéral"
    },
    date_ajout: new Date()
})

Sortie retournée par le moteur :

{
  acknowledged: true,
  insertedId: ObjectId("65f32a10e08b3941a39fbc11")
}

[!NOTE] Qu'est-ce qu'un ObjectId ?
Si vous ne spécifiez pas explicitement de champ _id, MongoDB génère un ObjectId unique de 12 octets encodé en hexadécimal sur 24 caractères : - 4 octets : Horodatage de création (timestamp Unix en secondes). - 5 octets : Identifiant aléatoire unique de la machine et du processus. - 3 octets : Compteur séquentiel auto-incrémenté démarré à une valeur aléatoire.
Cet identifiant est naturellement ordonné chronologiquement par date de création !

Pour insérer plusieurs documents en une seule requête réseau optimisée :

db.produits.insertMany([
    {
        reference: "MOUSE-01",
        nom: "Souris Ergonomique MX Master",
        categorie: "Accessoires",
        prix: 109.90,
        en_stock: true,
        tags: ["bluetooth", "bureautique"]
    },
    {
        reference: "KEYB-01",
        nom: "Clavier Mécanique RGB",
        categorie: "Accessoires",
        prix: 149.00,
        en_stock: false,
        tags: ["gamer", "usb-c"]
    },
    {
        reference: "SCREEN-01",
        nom: "Écran UltraWide 34 pouces",
        categorie: "Informatique",
        prix: 689.00,
        en_stock: true,
        tags: ["ecran", "4k", "hdr"]
    }
])

R — READ : Recherche, filtrage et projection#

La méthode fondamentale de recherche est find(filtre, projection). Appelée sans argument, elle retourne tous les documents de la collection.

// Afficher tous les produits
db.produits.find()

Opérateurs de comparaison courants#

Opérateur Signification Exemple d'utilisation
$eq Égal à { categorie: { $eq: "Informatique" } } ou plus simplement { categorie: "Informatique" }
$ne Différent de { en_stock: { $ne: false } }
$gt / $gte Strictement supérieur / Supérieur ou égal { prix: { $gte: 200 } }
$lt / $lte Strictement inférieur / Inférieur ou égal { prix: { $lt: 1000 } }
$in Appartient à une liste { categorie: { $in: ["Informatique", "Accessoires"] } }
$nin N'appartient pas à la liste { reference: { $nin: ["KEYB-01"] } }

Exemple : Trouver les produits de la catégorie « Informatique » dont le prix est supérieur ou égal à 500 € :

db.produits.find({
    categorie: "Informatique",
    prix: { $gte: 500 }
})

Opérateurs logiques ($or, $and, $nor)#

Rechercher les produits qui sont soit en rupture de stock, soit d'un prix inférieur à 120 € :

db.produits.find({
    $or: [
        { en_stock: false },
        { prix: { $lt: 120 } }
    ]
})

Requêtes sur champs imbriqués et tableaux#

Grâce à la Dot Notation (champs.sous_champ), vous pouvez filtrer directement au cœur des documents hiérarchiques :

// Filtrer sur un sous-document
db.produits.find({ "caracteristiques.ram_go": 36 })

// Filtrer sur la présence d'un élément dans un tableau
db.produits.find({ tags: "bluetooth" })

// Filtrer avec plusieurs tags obligatoires ($all)
db.produits.find({ tags: { $all: ["ecran", "4k"] } })

Projections (Sélection des colonnes)#

Le second argument de find() permet d'inclure (1) ou d'exclure (0) des champs du résultat final pour alléger le transit réseau :

// Renvoyer uniquement le nom et le prix (en masquant l'identifiant _id)
db.produits.find(
    { en_stock: true },
    { nom: 1, prix: 1, _id: 0 }
)

Tri, Saut et Pagination#

// Trier par prix décroissant (-1) et ne conserver que les 2 plus chers
db.produits.find().sort({ prix: -1 }).limit(2)

// Pagination : ignorer les 2 premiers et prendre les 2 suivants
db.produits.find().sort({ prix: 1 }).skip(2).limit(2)

U — UPDATE : Modification ciblée#

[!WARNING] Dans MongoDB, l'utilisation d'opérateurs de mise à jour atomiques (comme $set) est obligatoire. Si vous omettez $set et écrivez db.produits.updateOne({ ref: "X" }, { prix: 50 }), le document entier sera écrasé et remplacé par l'unique champ { prix: 50 }, perdant ainsi toutes ses autres propriétés !

Opérateurs de modification atomiques#

Opérateur Action effectuée
$set Modifie la valeur d'un ou plusieurs champs (ou les crée s'ils n'existent pas).
$unset Supprime un champ spécifique du document.
$inc Incrémente ou décrémente une valeur numérique (ex: stock, vues).
$push Ajoute un élément à la fin d'un tableau existant.
$pull Retire tous les éléments correspondant à une condition d'un tableau.
$addToSet Ajoute un élément dans un tableau uniquement s'il n'y figure pas déjà (garantit l'unicité).

Exemple : Mettre à jour le prix et réapprovisionner le stock :

db.produits.updateOne(
    { reference: "KEYB-01" },
    {
        $set: { en_stock: true, prix: 139.90 },
        $push: { tags: "promo" }
    }
)

Mise à jour multiple de masse :

// Appliquer une augmentation de 5 € sur tous les accessoires
db.produits.updateMany(
    { categorie: "Accessoires" },
    { $inc: { prix: 5 } }
)

D — DELETE : Suppression de documents#

// Supprimer un seul document correspondant au critère
db.produits.deleteOne({ reference: "MOUSE-01" })

// Supprimer tous les articles en rupture de stock
db.produits.deleteMany({ en_stock: false })

// Supprimer l'intégralité des documents d'une collection
db.produits.deleteMany({})

// Supprimer complètement la collection elle-même
db.produits.drop()

3. Interagir via des outils graphiques#

MongoDB Compass (Recommandé)#

Téléchargeable gratuitement sur le site officiel, MongoDB Compass offre : - Un explorateur visuel d'arborescences de documents. - L'outil Schema Tab : analyse automatique de la structure de vos collections, avec détection des pourcentages de types et graphiques de distribution des valeurs numériques. - Un éditeur d'agrégations interactif permettant de visualiser le résultat étape par étape (Pipeline Builder). - La génération automatique du code de votre requête vers Python, Node.js, Java ou C#.

DBeaver#

Si vous utilisez déjà DBeaver pour vos bases SQL : 1. Créez une nouvelle connexion en choisissant le pilote MongoDB. 2. Renseignez l'hôte (localhost), le port (27017), l'utilisateur (admin), le mot de passe (Password123) et la base d'authentification (admin). 3. DBeaver permet d'exécuter des requêtes au format JSON directement dans son éditeur SQL.


4. Interagir en Python avec pymongo#

Le pilote officiel de référence pour Python est PyMongo. Il traduit automatiquement les dictionnaires Python en BSON et inversement.

Installation de la bibliothèque#

Dans votre environnement virtuel Python :

pip install pymongo

Script complet de manipulation des données#

Créez un fichier demo_mongodb.py :

"""
Exemple complet d'opérations CRUD sur MongoDB avec PyMongo.
Auteur : Joseph Konka (AlgoJungle)
"""

from datetime import datetime
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure, PyMongoError

# Chaîne de connexion standardisée avec base d'authentification
URI_MONGODB = "mongodb://admin:Password123@localhost:27017/?authSource=admin"


def main():
    try:
        # 1. Établissement de la connexion cliente
        print("⏳ Connexion au serveur MongoDB...")
        client = MongoClient(URI_MONGODB, serverSelectionTimeoutMS=5000)

        # Vérification immédiate de la communication (Ping)
        client.admin.command("ping")
        print("✅ Connexion réussie à MongoDB !")

        # 2. Sélection de la base et de la collection
        db = client["formation_db"]
        collection_etudiants = db["etudiants"]

        # Nettoyage initial pour assurer la reproductibilité du test
        collection_etudiants.delete_many({})

        # 3. CREATE : Insertion de documents
        etudiants = [
            {
                "matricule": "ETU-001",
                "nom": "Alice Martin",
                "filiere": "Data Science",
                "notes": [16, 18, 14.5],
                "inscription": datetime.now(),
            },
            {
                "matricule": "ETU-002",
                "nom": "Bob Durand",
                "filiere": "Cybersécurité",
                "notes": [12, 13.5, 11],
                "inscription": datetime.now(),
            },
            {
                "matricule": "ETU-003",
                "nom": "Claire Dubois",
                "filiere": "Data Science",
                "notes": [19, 17.5, 18],
                "inscription": datetime.now(),
            },
        ]

        resultat_insertion = collection_etudiants.insert_many(etudiants)
        print(f"📥 {len(resultat_insertion.inserted_ids)} étudiants insérés.")

        # 4. READ : Recherche avec filtre et projection
        print("\n🔍 Étudiants inscrits en Data Science :")
        curseur = collection_etudiants.find(
            {"filiere": "Data Science"},
            {"nom": 1, "matricule": 1, "notes": 1, "_id": 0}
        )

        for etu in curseur:
            moyenne = sum(etu["notes"]) / len(etu["notes"])
            print(f"  - {etu['nom']} ({etu['matricule']}) | Moyenne: {moyenne:.2f}/20")

        # 5. UPDATE : Ajout d'une nouvelle note avec $push
        print("\n✏️ Ajout d'une note de 20/20 à Alice Martin...")
        collection_etudiants.update_one(
            {"matricule": "ETU-001"},
            {"$push": {"notes": 20}}
        )

        # Vérification après mise à jour
        alice = collection_etudiants.find_one({"matricule": "ETU-001"})
        print(f"  Notes actualisées d'Alice : {alice['notes']}")

        # 6. DELETE : Suppression d'un enregistrement
        print("\n🗑️ Radiation de l'étudiant ETU-002...")
        collection_etudiants.delete_one({"matricule": "ETU-002"})
        print(f"  Nombre total d'étudiants restants : {collection_etudiants.count_documents({})}")

    except ConnectionFailure:
        print("❌ Impossible de joindre le serveur MongoDB. Le conteneur Docker est-il allumé ?")
    except PyMongoError as err:
        print(f"❌ Erreur MongoDB : {err}")
    finally:
        client.close()
        print("\n🔒 Connexion cliente fermée proprement.")


if __name__ == "__main__":
    main()

Exécution du script#

Lancez le script depuis votre terminal :

python demo_mongodb.py

Résultat obtenu dans le terminal :

⏳ Connexion au serveur MongoDB...
✅ Connexion réussie à MongoDB !
📥 3 étudiants insérés.

🔍 Étudiants inscrits en Data Science :
  - Alice Martin (ETU-001) | Moyenne: 16.17/20
  - Claire Dubois (ETU-003) | Moyenne: 18.17/20

✏️ Ajout d'une note de 20/20 à Alice Martin...
  Notes actualisées d'Alice : [16, 18, 14.5, 20]

🗑️ Radiation de l'étudiant ETU-002...
  Nombre total d'étudiants restants : 2

🔒 Connexion cliente fermée proprement.


Vous maîtrisez à présent l'ensemble du cycle CRUD sur MongoDB. Dans le chapitre suivant, nous allons nous attaquer à un cas d'application d'entreprise complet mobilisant le puissant Pipeline d'Agrégation pour l'analyse de données massives !

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue