Menu

MongoDB avec Node.js : exemples du driver (find, insert)

Utilisez MongoDB depuis Node.js avec le driver officiel mongodb : connectez-vous avec MongoClient, puis insérez, cherchez, modifiez et supprimez des documents dans une collection, le tout avec async/await.

Cette page contient des éditeurs exécutables. Modifiez, exécutez et voyez la sortie instantanément.

Pour utiliser MongoDB depuis Node.js, installez le driver officiel (npm install mongodb), connectez-vous avec new MongoClient(uri), choisissez une base avec client.db('name') et une collection avec db.collection('name'). Chaque opération (insertOne, find, updateOne, deleteOne) renvoie une promesse, donc vous l'attendez avec await. Les documents entrent et sortent sous forme d'objets JavaScript simples.

Le programme affiche [ 'Dune', 'Neuromancer', 'Hyperion' ]. La base shop et la collection books n'existaient pas avant : MongoDB les crée au premier insert, et toArray() charge tous les documents vers lesquels pointe le curseur de find().

Chercher des documents avec filtres et projection

Un filtre est un objet qui décrit les documents voulus. Les valeurs simples correspondent exactement ; les opérateurs comme $gt, $lt, $in et $regex se placent dans un objet imbriqué. La projection du second argument choisit les champs renvoyés.

recent contient les deux livres les plus récents après 1960, Hyperion puis Neuromancer, avec seulement title et year ; findOne renvoie la première correspondance (ou null), et countDocuments compte 2 livres à 10 ou plus. Remplacez $gt: 1960 par $gt: 1985 et il ne reste qu'Hyperion.

Modifier et supprimer

updateOne(filter, update) modifie le premier document correspondant. La mise à jour utilise des opérateurs : $set remplace des champs, $inc ajoute à un nombre, $unset supprime un champ et $push ajoute à un tableau. updateMany et deleteMany agissent sur toutes les correspondances.

La mise à jour a trouvé et modifié un document, donc Dune coûte maintenant 10 avec 2 en stock, et supprimer le livre sans stock en laisse 1. Une mise à jour doit utiliser des opérateurs : passez { price: 10 } sans $set et le driver la refuse (replaceOne est l'appel qui remplace un document entier).

ObjectId et index

Chaque document reçoit un _id ; si vous n'en définissez pas, le driver crée un ObjectId. Pour trouver un document à partir d'un id arrivé sous forme de chaîne (depuis une URL, par exemple), enveloppez-le dans new ObjectId(id). Un index rend la recherche sur un champ rapide, et un index unique fait refuser les doublons par MongoDB.

Un ObjectId fait 24 caractères hexadécimaux sous forme de chaîne, et chercher avec la chaîne brute ne trouve rien, donc cette ligne affiche null. Le second insert viole l'index unique et échoue avec le code 11000, ce qui permet de détecter un « email déjà utilisé ».

Utiliser MongoDB dans une API Express

Connectez-vous une seule fois au démarrage du serveur et partagez la collection ; n'ouvrez pas une nouvelle connexion par requête. Le driver garde un pool de connexions et les réutilise.

GET /books renvoie les deux livres, chacun avec un _id. Copiez un id dans GET /books/<id> pour récupérer un seul livre, ou envoyez POST /books avec un corps JSON comme {"title": "Foundation", "year": 1951} et listez à nouveau les livres.

Une vraie application lit la chaîne de connexion depuis process.env.MONGODB_URI au lieu de l'écrire dans le code.

Si vous voulez des schémas et de la validation par-dessus le driver, Mongoose (npm install mongoose) l'enveloppe :

const Book = mongoose.model('Book', new mongoose.Schema({ title: String, year: Number }));
await Book.create({ title: 'Dune', year: 1965 });

Erreurs fréquentes

Oublier toArray(). find() renvoie un curseur, pas des documents. L'afficher montre un objet curseur ; appelez toArray(), ou parcourez-le avec for await.

Se connecter à chaque requête. Chaque new MongoClient ouvre son propre pool. Créez un seul client au démarrage et réutilisez-le partout.

Ne jamais fermer le client dans un script. Un client ouvert garde le processus en vie une fois votre code terminé. Appelez await client.close() à la fin des scripts ; un serveur le garde ouvert pendant toute sa durée de vie.

Questions fréquentes

Faut-il utiliser le driver mongodb ou Mongoose ?

Le driver est la couche officielle, plus légère : vous travaillez avec des objets simples et le langage de requête propre à MongoDB. Mongoose ajoute par-dessus des schémas, de la validation et des modèles, ce qui aide quand vous voulez que chaque document soit vérifié. Les deux parlent à la même base, et Mongoose utilise le driver en interne.

Faut-il créer la base de données ou la collection d'abord ?

Non. MongoDB crée les deux la première fois que vous y insérez un document. client.db('shop') et db.collection('books') ne renvoient que des références.

Où mettre la chaîne de connexion ?

Dans une variable d'environnement comme MONGODB_URI, lue avec process.env.MONGODB_URI. La chaîne d'une base hébergée contient un mot de passe, elle ne doit donc jamais être commitée dans le dépôt.

Pourquoi find ne renvoie aucun document quand je cherche par id ?

_id est stocké sous forme d'ObjectId, pas de chaîne, donc { _id: '65f1...' } ne trouve rien. Convertissez-le d'abord : { _id: new ObjectId(id) }.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

Commencer