[TUTO] Utiliser MongoDB avec Node.js

Vous voulez utiliser une basse de données simple et performante avec Node.js, ça tombe bien, je vous propose de découvrir comment utiliser la base de données NoSQL MongoDB avec Node.js.

Si MongoDB ne vous évoque rien ou si vous voulez l’installer, je vous invite à voir mon précédent tuto sur MongoDB.

Installation

Pour commencer, nous allons installer le driver officiel MongoDB. Pour cela exécuter la commande NPM suivante à la racine de votre projet  :

> npm intall mongodb

Pour la suite de ce tutoriel, vous devez avoir MongoDB d’installé et démarré.

Connexion à MongoDB

Pour interagir sur notre base de données, il faut commencer par établir une connexion. Pour cela, nous utilisons la méthode connect() du client MongoDB fournit par le driver :

// Récupération du client mongodb
var mongoClient = require('mongodb').MongoClient;

// Paramètres de connexion
var url = 'mongodb://localhost/db_name';

// Connexion au serveur avec la méthode connect
mongoClient.connect(url, function (err, db) {
    if (err) {
        return console.error('Connection failed', err);
    }
    console.log('Connection successful on ', url);
    
    // Nous allons travailler ici ...

    // Fermeture de la connexion
    db.close()
});

La méthode connect() prend en arguments les paramètres de connexion et une fonction de callback dans laquelle est transmise les éventuelles erreurs et la connexion à notre BDD.

Une fois le travail effectué sur notre BDD, on n’oubliera pas de fermer la connexion avec la méthode close().

Insertion d’un document

Une fois la connexion établie, nous pouvons insérer des documents dans notre BDD :

// Récupération de la collection users
var collection = db.collection('users');

// Création de deux objets users
var user1 = {firstName: 'Foo', lastName: 'Fighters'};
var user2 = {firstName: 'Bob', lastName: 'Dylan'};

// Enregistrement de plusieurs objets en db avec insertMany
collection.insertMany([user1, user2], function (err, result) {
    if (err) {
        console.error('Insert failed', err);
    } else {
        console.log('Insert successful', result);
    }
    
    db.close()
});

// Enregistrement d'un objet en db avec insertOne
//collection.insertOne(user1);

Avant toutes manipulations avec les documents, il faut récupérer la collection à laquelle seront rattaché nos documents avec la méthode collection(‘collectionName’). Si la collection n’existe pas, elle sera créée à la première insertion.

Je ne détaille pas plus le code, il est suffisamment clair et commenté pour être compréhensible. Si néanmoins ce n’est pas le cas, vous pouvez toujours laisser un commentaire et je vous répondrais 😉

Mise à jour d’un document

Pour mettre à jour un document, nous utilisons la méthode updateOne() ou updateMany() :

// Mise à jour d'un document 
collection.updateOne({firstName: 'Bob'}, {$set: {lastName: 'Marley'}}, function (err, result) {
    if (err) {
        console.error('Update failed', err);
    } else {
        console.log('Update successful', result);
    }
    
    db.close()
});

// Mise à jour de plusieurs documents
//collection.updateMany();

Le premier paramètre de la méthode est le filtre de recherche, ici, nous recherchons un document avec une propriété firstName égale à Bob. Et le second, les paramètres de mise à jour du document, dans notre cas en change la valeur de la propriété lastName avec tag $set.

Pour plus d’information sur les paramètres de mise à jour, je vous invite à jeter un œil sur la doc officiel.

Suppression d’un document

La suppression s’effectue avec la méthode deleteOne() ou deleteMany() :

// Suppression d'un document
collection.deleteOne({firstName: 'Bod'}, function (err, result) {
    if (err) {
        console.error('Remove failed', err);
    } else {
        console.log('Remove successful', result);
    }
    
    db.close()
});

// Suppression plusieurs documents
//collection.deleteMany();

Prudence avec la méthode deleteMany(), en effet si vous indiquer un filtre vide ({}) en paramètre, cela aura pour conséquence de supprimer tous les documents de la collection !

Rechercher un document

La recherche de document s’effectue avec la méthode find() :

// Récupération de tous les documents de la collection
collection.find().toArray(function (err, result) {
    if (err) {
        console.error('Find failed', err);
    } else {
        console.log('Find successful', result);
    }
    
    db.close()
});

// Récupération à partir d'une requête (firstName like b) 
//var query = {firstName: /b/ };
//collection.find(query); 

// Récupération du 1er document avec l'aggregationCursor limit 
//collection.find().limit(1);

La méthode find() prend en paramètre une query et retourne un curseur. Pour exploiter directement le résultat sous la forme d’un tableau, vous avez la possibilité d’utiliser la méthode toArray().

Noter que nous pouvons piper le curseur avec certaines méthodes dites d’agrégation de curseur (aggregation cursor) comme la méthode limit() ou sort().

Conclusion

Dans ce tutoriel, nous avons vu comment utiliser le driver natif MongoDB pour interagir avec notre base de données avec Node.js.

Noté que vous pouvez utiliser les méthodes que nous avons vues avec des promises. Pour cela, il suffit de ne pas donner de fonction de callback en paramètre.

Pour plus de détail, je vous invite à aller voir la documentation officielle que vous trouverais ici.

Dans un prochain article, nous verrons comment utiliser MongoDB via un ORM avec Mongoose et Express.js, afin de simplifier les interactions et de structurer nos données.

Laisser un commentaire