par Nick Karnik

Mongoose est une bibliothèque ODM (Object Data Modeling) pour MongoDB et Node.js. Il gère les relations entre les données, fournit la validation du schéma et est utilisé pour traduire entre les objets dans le code et la représentation de ces objets dans MongoDB.

mappage D’objets entre le nœud et MongoDB géré via Mongoose

MongoDB est une base de données de documents NoSQL sans schéma., Cela signifie que vous pouvez y stocker des documents JSON, et la structure de ces documents peut varier car elle n’est pas appliquée comme les bases de données SQL. C’est l’un des avantages de L’utilisation de NoSQL car elle accélère le développement d’applications et réduit la complexité des déploiements.

ci-dessous est un exemple de la façon dont les données sont stockées dans la base de données Mongo vs SQL:

Documents NoSQL vs., Les Tables relationnelles dans SQL

Terminologies

Collections

Les‘Collections’ dans Mongo sont équivalentes aux tables dans les bases de données relationnelles. Ils peuvent contenir plusieurs documents JSON.

Documents

« Documents » sont équivalentes à des enregistrements ou des lignes de données dans SQL. Alors qu’une ligne SQL peut référencer des données dans d’autres tables, les documents Mongo combinent généralement cela dans un document.

Champs

« Champs » ou les attributs sont semblables à des colonnes dans une table SQL.

schéma

alors que Mongo est sans schéma, SQL définit un schéma via la définition de la table., Un « schéma » de mangouste est une structure de données de document (ou une forme du document) qui est appliquée via la couche application.

Models

Les‘Models’ sont des constructeurs d’ordre supérieur qui prennent un schéma et créent une instance d’un document équivalent à des enregistrements dans une base de données relationnelle.

mise en route

Installation de Mongo

avant de commencer, configurons Mongo., Vous pouvez choisir parmi l’une des options suivantes (nous utilisons l’option #1 pour cet article):

  1. Téléchargez la version MongoDB appropriée pour votre système d’exploitation à partir du site Web MongoDB et suivez leurs instructions d’installation
  2. créer un abonnement gratuit à la base de données sandbox sur mLab
  3. installer Mongo en utilisant Docker si vous préférez utiliser docker

naviguons à travers quelques-unes des bases de MongoDB en implémentant un modèle qui représente les données pour un carnet d’adresses simplifié.

j’utilise Visual Studio Code, Node 8.9 et NPM 5.6., Lancez votreE préféré, créez un projet vierge et commençons! Nous utiliserons la syntaxe ES6 limitée dans Node, nous ne configurerons donc pas Babel.

NPM Install

allons dans le dossier du projet et initialisons notre projet

npm init -y

installons Mongoose et une bibliothèque de validation avec la commande suivante:

npm install mongoose validator

la commande d’installation ci-dessus installera la dernière version des bibliothèques. La syntaxe Mongoose dans cet article est spécifique à Mongoose v5 et au-delà.,

connexion à la base de données

créez un fichier./src/database.js sous la racine du projet.

ensuite, nous allons ajouter une classe simple avec une méthode qui se connecte à la base de données.

Votre chaîne de connexion varient en fonction de votre installation.

l’appel require(‘mongoose’) ci-dessus renvoie un objet Singleton. Cela signifie que la première fois que vous appelez require(‘mongoose’), il crée une instance de la classe Mongoose et la renvoie., Lors des appels suivants, il renverra la même instance qui vous a été créée et renvoyée la première fois en raison du fonctionnement de l’importation/exportation de module dans ES6.

Module import/require work-flow

de même, nous avons transformé notre classe de base de données en singleton en renvoyant une instance de la classe dans l’instructionmodule.exports car nous n’avons besoin que d’une seule connexion,

ES6 nous permet de créer très facilement un modèle singleton (instance unique) en raison du fonctionnement du chargeur de modules en mettant en cache la réponse d’un fichier précédemment importé.

schéma Mangouste vs modèle

Un modèle mangouste est un wrapper sur le schéma Mangouste. Un schéma Mongoose définit la structure du document, les valeurs par défaut, les validateurs, etc., alors qu’un modèle Mongoose fournit une interface à la base de données pour créer, interroger, mettre à jour, supprimer des enregistrements, etc.

la création d’un modèle de mangouste comprend principalement trois parties:

1., Référence Mangouste

let mongoose = require('mongoose')

Cette référence sera la même que celle qui a été renvoyée lorsque nous nous sommes connectés à la base de données, ce qui signifie que les définitions de schéma et de modèle n’auront pas besoin de se connecter explicitement à la base de données.

2. Définition du schéma

un schéma définit les propriétés du document à travers un objet où le nom de la clé correspond au nom de la propriété dans la collection.,

let emailSchema = new mongoose.Schema({ email: String})

ici, nous définissons une propriété appelée email avec une chaîne de type schéma qui correspond à un validateur interne qui sera déclenché lorsque le modèle sera enregistré dans la base de données. Il échouera si le type de données de la valeur n’est pas un type de chaîne.

Le Schéma suivant les Types sont autorisés:

  • Array
  • Boolean
  • Tampon
  • Date
  • Mixte (générique / flexible de type de données)
  • Nombre
  • ObjectId
  • Chaîne

Mixte et ObjectId sont définis dans require(‘mongoose’).Schema.Types.

3., Exportation d’un modèle

Nous devons appeler le constructeur du modèle sur l’instance Mongoose et lui transmettre le nom de la collection et une référence à la définition du schéma.

module.exports = mongoose.model('Email', emailSchema)

combinons le code ci-dessus en./src/models/email.js pour définir le contenu d’un modèle de messagerie de base:

Une définition de schéma doit être simple, mais sa complexité est généralement basée sur les exigences de l’application. Les schémas peuvent être réutilisés et ils peuvent également contenir plusieurs schémas enfants. Dans l’exemple ci-dessus, la valeur de la propriété email est un simple type de valeur., Cependant, il peut également s’agir d’un type d’objet avec des propriétés supplémentaires.

nous pouvons créer une instance du modèle que nous avons défini ci-dessus et la remplir en utilisant la syntaxe suivante:

let EmailModel = require('./email')let msg = new EmailModel({ email: '[email protected]'})

améliorons le schéma de messagerie pour faire de la propriété email un champ obligatoire unique et convertissons la valeur en minuscules avant de l’enregistrer. Nous pouvons également ajouter une fonction de validation qui garantira que la valeur est une adresse e-mail valide. Nous référencerons et utiliserons la bibliothèque de validateurs installée précédemment.,

opérations de base

Mongoose a une API flexible et fournit de nombreuses façons d’accomplir une tâche. Nous ne nous concentrerons pas sur les variations car cela est hors de portée de cet article, mais rappelez-vous que la plupart des opérations peuvent être effectuées de plusieurs manières, soit syntaxiquement, soit via l’architecture de l’application.,

Create Record

créons une instance du modèle de messagerie et sauvegardons-la dans la base de données:

le résultat est un document qui est renvoyé après une sauvegarde réussie:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

les champs suivants sont retournés (les champs internes sont préfixés par un trait de soulignement):

  1. e94a319662″> le champ est généré automatiquement par Mongo et est une clé primaire de la collection. Sa valeur est un identifiant unique pour le document.
  2. La valeur du champemail est renvoyée., Notez qu’il est inférieur car nous avons spécifié l’attributlowercase:true dans le schéma.
  3. __v est la propriété versionKey définie sur chaque document lors de sa création par Mongoose. Sa valeur contient la révision interne du document.

Si vous essayez de répéter l’opération d’enregistrement ci-dessus, vous obtiendrez une erreur car nous avons précisé que le champ e-mail doit être unique.

Fetch Record

essayons de récupérer l’enregistrement que nous avons enregistré dans la base de données plus tôt., La classe model expose plusieurs méthodes statiques et d’instance pour effectuer des opérations sur la base de données. Nous allons maintenant essayer de trouver l’enregistrement que nous avons créé précédemment en utilisant la méthode find et passer l’e-mail comme terme de recherche.

EmailModel .find({ email: '[email protected]' // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

le document retourné sera similaire à ce qui était affiché lors de la création de l’enregistrement:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

Update Record

modifions l’enregistrement ci-dessus en changeant l’adresse e-mail et en y ajoutant un autre champ, le tout en une seule opération., Pour des raisons de performances, Mongoose ne retournera pas le document mis à jour, nous devons donc passer un paramètre supplémentaire pour le demander:

le document renvoyé contiendra l’e-mail mis à jour:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }

Supprimer L’enregistrement

Nous utiliserons l’appel findOneAndRemove pour, Il renvoie le document d’origine qui a été supprimé:

Helpers

Nous avons examiné certaines des fonctionnalités de base ci-dessus connues sous le nom D’opérations CRUD (Create, Read, Update, Delete), mais Mongoose offre également la possibilité de configurer plusieurs types de méthodes et de propriétés d’assistance. Ceux-ci peuvent être utilisés pour simplifier le travail avec les données.

nous allons créer un utilisateur de schéma dans ./src/models/user.js avec les champsfirstName et lastName:

Propriété Virtuelle

Une propriété virtuelle n’est pas conservée dans la base de données., Nous pouvons l’ajouter à notre schéma en tant qu’aide pour obtenir et définir des valeurs.

créons une propriété virtuelle appelée fullName qui peut être utilisée pour définir des valeurs sur firstName Et lastName et les récupérer en tant que valeur combinée lors de la lecture:

Les rappels pour get et set doivent utiliser Modèle via le mot-clé this. L’utilisation des fonctions fat arrow changera ce à quoi this fait référence.,

maintenant, nous pouvons définir firstName Et lastName en attribuant une valeur à fullName:

le code ci-dessus affichera ce qui suit:

{ _id: 5a7a4248550ebb9fafd898cf, firstName: 'Thomas', lastName: 'Anderson' } Thomas Anderson

méthodes d’instance

Nous pouvons créer des méthodes d’assistance personnalisées sur le schéma et y accéder via l’instance du modèle. Ces méthodes auront accès à l’objet modèle et elles peuvent être utilisées de manière assez créative. Par exemple, nous pourrions créer une méthode pour trouver toutes les personnes qui ont le même prénom que l’instance actuelle.,

dans cet exemple, créons une fonction pour renvoyer les initiales de l’utilisateur actuel. Nous allons ajouter un helper personnalisé méthode appelée getInitials le schéma:

userSchema.methods.getInitials = function() { return this.firstName + this.lastName}

Cette méthode sera accessible via une instance du modèle:

les Méthodes Statiques

Similaires aux méthodes d’instance, nous pouvons créer des méthodes statiques sur le schéma., Créons une méthode pour récupérer tous les utilisateurs de la base de données:

appelergetUserssur la classe Model renverra tous les utilisateurs de la base de données:

UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })

L’ajout de méthodes d’instance et statiques est une bonne approche pour implémenter une interface

Middleware

Middleware sont des fonctions qui s’exécutent à des étapes spécifiques d’un pipeline., Mongoose prend en charge le middleware pour les opérations suivantes:

  • Aggregate
  • Document
  • Model
  • Query

Par exemple, les modèles ont des fonctions pre Et post qui prennent deux paramètres:

  1. Type d’événement (‘Init’, ‘validate’, ‘save’, ‘remove’)
  2. un rappel exécuté avec cette référence à l’instance du modèle
exemple de middleware (alias., pré-et post-crochets)

nous allons essayer un exemple par l’ajout de deux champs createdAt et updatedAt à notre schéma:

Lors de la model.save() est appelée, il y a un pre(‘save’, …) et post(‘save’, …) événement est déclenché. Pour le deuxième paramètre, vous pouvez passer une fonction qui est appelée lorsque l’événement est déclenché. Ces fonctions prennent un paramètre à la fonction suivante dans la chaîne middleware.,

ajoutons un hook de pré-sauvegarde et définissons les valeurs pourcreatedAt EtupdatedAt:

créons et sauvegardons notre modèle:

vous devriez voir les valeurs pourcreatedAt EtupdatedAt lorsque l’enregistrement créé est imprimé:

plugins

supposons que nous souhaitions suivre la date de création et de dernière mise à jour d’un enregistrement sur chaque collection de notre base de données. Au lieu de répéter le processus ci-dessus, nous pouvons créer un plugin et l’appliquer à chaque schéma.,

créons un fichier./src/model/plugins/timestamp.js et répliquons la fonctionnalité ci-dessus en tant que module réutilisable:

Pour utiliser ce plugin, nous le transmettons simplement aux schémas qui devraient recevoir cette fonctionnalité:

Query Building

Mongoose a une API très riche qui gère de nombreuses opérations complexes supportées par MongoDB. Considérons une requête où nous pouvons construire progressivement des composants de requête.,

Dans cet exemple, nous allons:

  1. Trouver tous les utilisateurs
  2. Ignorer les 100 premiers dossiers
  3. Limiter les résultats à 10 dossiers
  4. Trier les résultats par le champ firstName
  5. Sélectionnez le prenom
  6. Exécuter cette requête

Fermeture

Nous avons à peine gratté la surface d’explorer les capacités de la Mangouste. C’est une riche bibliothèque pleine de fonctionnalités utiles et puissantes qui en font un plaisir de travailler avec des modèles de données dans la couche application.,

bien que vous puissiez interagir directement avec Mongo en utilisant Mongo Driver, Mongoose simplifiera cette interaction en vous permettant de modéliser les relations entre les données et de les valider facilement.

fait amusant: Mongoose est créé par Valeri Karpov qui est un ingénieur incroyablement talentueux! Il a inventé le terme la pile moyenne.

si cet article a été utile, ??? et suivez-moi sur Twitter.

Vous aimerez aussi mon atelier sur youtube: Comment créer une API REST avec Node | Express | Mongo