Aller au contenu

Introduction à Mongoose

Mongoose est une bibliothèque JavaScript fréquemment utilisée dans une application Node.js exploitant une base de données MongoDB.

Il fournit une solution simple permettant de modéliser les données dans vos applications en précisant les schémas à respecter.

Mongoose est un ODM (Object Document Mapper), ce qui permet de traduire la notion d’objets en documents JSON.

Depuis octobre 2020, Mongoose supporte également le langage TypeScript. (Mongoose et TypeScript)

Vous trouverez sur Internet plusieurs tutoriels pour créer une application qui utilise Node.js, MongoDB et Mongoose. Les exemples présentés dans ces notes de cours sont inspirés de la marche à suivre présentée par MDN Web Docs ainsi que celui-ci.

La première étape consiste à ajouter le module Mongoose à votre application :

console
npm install mongoose

Vous devez ensuite définir le schéma des données à stocker dans une base de données MongoDB.
Une pratique recommandée consiste à créer un dossier models dans lequel tous les schémas de votre application seront stockés Voici la définition d’un objet auteur : MDN Author Model

Schéma Mongoose - Auteur

auteur.ts
import { Schema, model } from 'mongoose';


// Interface pour un auteur
// Notez l'utilisation de id au lieu de _id. Mongoose crée automatiquement un _id pour chaque document.
export interface IAuteur {
    id: string;
    prenom: string;
    nom: string;
    date_naissance?: Date;
    date_deces?: Date;
};


const AuteurSchema = new Schema<IAuteur>({
    id: { type: String, required: true, maxlength: 100 },
    prenom: { type: String, required: true, maxlength: 100 },
    nom: { type: String, required: true, maxlength: 100 },
    date_naissance: Date,
    date_deces: Date,
});

export const Auteur = model<IAuteur>('Auteur', AuteurSchema);

Note

Le premier paramètre de model<>() est le nom singulier de la collection de votre modèle. Mongoose recherche automatiquement la version au pluriel du nom comme nom de la collection. Par exemple, Auteur aura la collection auteurs. Pour empêcher que Mongoose n'utilise un mauvais pluriel (pensez Bijou qui devient Bijoux et non pas Bijous), faire la commande : mongoose.pluralize(null);

Les routes : Get - Tous

route.ts
import { IAuteur, Auteur } from '@src/models/Auteur';

import mongoose from 'mongoose';
const uri =
  'mongodb://localhost:27017/nom_bd?readPreference=primary&ssl=false';

/**
* Extraire tous les auteurs.
*
* @returns {IAuteur[]} Un tableau de tous les auteurs
*/
async function getAll(): Promise<IAuteur[]> {
    await mongoose.connect(uri);
    const auteurs = await Auteur.find();
    mongoose.connection.close();
    return auteurs;
}

Les routes : Get - par Id

route.ts
/**
* Extraire un auteur.
*
* @param {string} id - ID de l'auteur à extraire
*
* @returns {IAuteur} - Un auteur si trouvé
*/

async function getOne(id: string,): Promise<IAuteur | null> {
    await mongoose.connect(process.env.MONGODB_URI!);
    const auteur = await Auteur.findOne({
        id: id,
    });
    mongoose.connection.close();
    return auteur;
}

Les routes : POST

route.ts
/**
* Ajouter un auteur.
* 
* @param {IAuteur} auteur - Auteur à ajouter
*/

async function add(auteur: IAuteur): Promise<void> {
    await mongoose.connect(process.env.MONGODB_URI!);
    const nouvelAuteur = new Auteur(auteur);
    await nouvelAuteur.save();
    mongoose.connection.close();
}

Option strict