af Nick Karnik

Desmerdyr er et Objekt, Data Modellering (ODM) bibliotek for MongoDB og Node.js. Det styrer forholdet mellem data, giver skema validering, og bruges til at oversætte mellem objekter i kode og repræsentation af disse objekter i MongoDB.

Objekt Mapping mellem Node og MongoDB, der forvaltes via Desmerdyr

MongoDB er et skema-mindre NoSQL dokument database., Det betyder, at du kan gemme JSON-dokumenter i det, og strukturen af disse dokumenter kan variere, da det ikke håndhæves som s .l-databaser. Dette er en af fordelene ved at bruge NOS .l, da det fremskynder applikationsudvikling og reducerer kompleksiteten af implementeringer.

Nedenfor er et eksempel på, hvordan data er lagret i Mongo vs. SQL-Database:

NoSQL Dokumenter vs., Relationelle Tabeller i SQL

Terminologier

Samlinger

‘Samling’ i Mongo er tilsvarende tabeller i relationelle databaser. De kan holde flere JSON-dokumenter.

dokumenter

‘dokumenter’ svarer til poster eller rækker af data i S .l. Mens en s .l-række kan henvise til data i andre tabeller, kombinerer Mongo-dokumenter normalt det i et dokument.

felter

‘felter’ eller attributter ligner kolonner i en s .l-tabel.

Skema

mens Mongo er skemaløs, definerer s .l et skema via tabeldefinitionen., Et Mongoose ‘skema’ er en dokumentdatastruktur (eller form af dokumentet), der håndhæves via applikationslaget.

modeller

‘modeller’ er højere ordens konstruktører, der tager et skema og skaber en forekomst af et dokument svarende til poster i en relationsdatabase.

Kom godt i gang

Mongo Installation

før vi kommer i gang, lad os setup Mongo., Du kan vælge mellem en af følgende muligheder (vi bruger mulighed #1 for denne artikel):

  1. Download passende MongoDB version til dit Operativsystem fra MongoDB Hjemmeside og følg deres instruktioner for installation
  2. Opret en gratis sandkasse database abonnement på mLab
  3. Installer Mongo hjælp Docker hvis du foretrækker at bruge docker

Lad os med at navigere gennem nogle af de grundlæggende Desmerdyr ved at implementere en model, der repræsenterer data for en forenklet adressebog.

Jeg bruger Visual Studio Code, Node 8.9 og NPM 5.6., Fire op din favorit IDE, oprette et tomt projekt, og lad os komme i gang! Vi bruger den begrænsede ES6-syntaks i Node, så vi konfigurerer ikke Babel.

NPM Installere

Lad os gå til projekt-mappen, og initialisere vores projekt

npm init -y

Lad os installere Desmerdyr og en validering bibliotek med følgende kommando:

npm install mongoose validator

ovenstående install-kommandoen vil installere den nyeste version af bibliotekerne. Den Mongoose syntaks i denne artikel er specifik for Mongoose v5 og videre.,

databaseforbindelse

Opret en fil./src/database.js under projektets rod.

dernæst tilføjer vi en simpel klasse med en metode, der opretter forbindelse til databasen.

din forbindelsesstreng varierer afhængigt af din installation.

require(‘mongoose’) opkaldet ovenfor returnerer et Singleton-objekt. Det betyder, at første gang du ringer require(‘mongoose’), skaber det en forekomst af Mongoose-klassen og returnerer den., Ved efterfølgende opkald returnerer den den samme forekomst, der blev oprettet og returneret til dig første gang på grund af, hvordan modulimport/eksport fungerer i ES6.

Modul import/kræve, work-flow

på samme måde, har vi vendt vores Database klassen i en singleton, som returnerer en instans af klassen i module.exports opgørelse, fordi vi kun har brug for en enkelt forbindelse til databasen.,

ES6 gør det meget nemt for os at skabe en singleton (enkelt instans) mønster på grund af hvordan modulet loader virker ved caching svar af en tidligere importeret fil.

Mongoose Schema vs. Model

en Mongoose model er en wrarapper på Mongoose skemaet. Et Mongoose-skema definerer Dokumentets struktur, standardværdier, validatorer osv., mens en Mongoose-model giver en grænseflade til databasen til oprettelse, forespørgsel, opdatering, sletning af poster osv.

oprettelse af en Mongoose-model består primært af tre dele:

1., Henvisning til Mongoose

let mongoose = require('mongoose')

denne reference vil være den samme som den, der blev returneret, da vi tilsluttede databasen, hvilket betyder, at skemaet og modeldefinitionerne ikke behøver at eksplicit oprette forbindelse til databasen.

2. Definition af skemaet

et skema definerer dokumentegenskaber gennem et objekt, hvor nøglenavnet svarer til egenskabsnavnet i samlingen.,

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

Her definerer vi en egenskab kaldet e-mail med en schema Type Streng, der kortlægger til en intern validator, der udløses, når modellen gemmes i databasen. Det vil mislykkes, hvis datatypen af værdien ikke er en strengtype.

følgende Skema Typer er tilladte:

  • Array
  • Boolean
  • Buffer
  • Dato
  • Blandet (Et generisk / fleksible data type)
  • Antal
  • ObjectId
  • String

Blandet og ObjectId er defineret under require(‘mongoose’).Schema.Types.

3., Eksport af en Model

Vi er nødt til at kalde modelkonstruktøren på Mongoose-forekomsten og videregive den navnet på samlingen og en henvisning til skemadefinitionen.

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

Lad os kombinere ovenstående kode i ./src/models/email.js til at definere indholdet af en grundlæggende e-mail-model:

En schema definition bør være enkle, men dens kompleksitet er normalt baseret på krav til ansøgningen. Skemaer kan genbruges, og de kan indeholde flere barn-skemaer også. I eksemplet ovenfor er værdien af e-mail-egenskaben en simpel værditype., Det kan dog også være en objekttype med yderligere egenskaber på den.

Vi kan oprette en forekomst af den model, vi definerede ovenfor, og udfylde den ved hjælp af følgende syntaks:

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

lad os forbedre e-mail-skemaet for at gøre e-mail-egenskaben til et unikt, påkrævet felt og konvertere værdien til små bogstaver, før du gemmer den. Vi kan også tilføje en valideringsfunktion, der sikrer, at værdien er en gyldig e-mail-adresse. Vi vil henvise til og bruge validator bibliotek installeret tidligere.,

grundlæggende operationer

Mongoose har en fleksibel API og giver mange måder at udføre en opgave på. Vi vil ikke fokusere på variationerne, fordi det ikke er muligt for denne artikel, men husk, at de fleste af operationerne kan udføres på mere end moren måde enten syntaktisk eller via applikationsarkitekturen.,

Opret Post

Lad os oprette en instans af e-mail-model og gemme det i databasen:

resultatet er et dokument, der er vendt tilbage efter en vellykket spar:

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

De følgende felter er vendt tilbage (indre felter skal have et præfiks med en underscore):

  1. _id felt er auto-genereret af Mongo og er en primær nøgle i den indsamling. Dens værdi er en unik identifikator for dokumentet.
  2. værdien af email feltet returneres., Bemærk, at det er lavere i kabinet, fordi vi specificerede lowercase:true attributten i skemaet.
  3. __v er versionkey-egenskaben indstillet på hvert dokument, når den først oprettes af Mongoose. Dens værdi indeholder den interne revision af dokumentet.

Hvis du forsøger at gentage gemningen ovenfor, får du en fejl, fordi vi har angivet, at e-mail-feltet skal være unikt.

Hent Record

lad os prøve at hente den post, vi gemte i databasen tidligere., Modelklassen udsætter flere statiske og instansmetoder til at udføre operationer i databasen. Vi vil nu prøve at finde den post, vi oprettede tidligere ved hjælp af find-metoden, og videregive e-mailen som søgeudtryk.

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

Den returnerede dokument vil svare til, hvad der blev vist, da vi skabte rekord:

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

Opdater Post

Lad os ændre registreringen ovenfor ved at ændre e-mail-adresse og tilføje et andet felt til det, alle i en enkelt operation., Af hensyn til ydeevnen, Mongoose vil ikke returnere de opdaterede dokument, så vi er nødt til at passere en ekstra parameter til at bede om det:

Den returnerede dokument vil indeholde opdaterede e-mail:

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

Slet Post

Vi vil bruge findOneAndRemove opkald for at slette en post., Det vender tilbage til den oprindelige dokument, der blev fjernet:

Hjælpere

Vi har kigget på nogle af de grundlæggende funktionalitet ovenfor kendt som CRUD (Create, Read, Update, Delete) operationer, men Desmerdyr giver også mulighed for at konfigurere flere typer af helper metoder og egenskaber. Disse kan bruges til yderligere at forenkle arbejdet med data.

Lad os oprette en bruger skema i ./src/models/user.js med de felterfirstName og lastName:

Virtuel Ejendom

En virtuel ejendom er ikke varede til databasen., Vi kan tilføje det til vores skema som en hjælper til at få og indstille værdier.

Lad os skabe en virtuel ejendom, der hed fullName, der kan bruges til at sætte værdier på firstName og lastName og hente dem, som har en samlet værdi, når det læses:

Tilbagekald for få, og skal du bruge funktionen søgeord som vi har brug for at få adgang til modellen via this søgeord. Brug af fat Arro. – funktioner vil ændre, hvad this refererer til.,

Nu, vi kan sætte firstName og lastName ved at tildele en værdi til fullName:

ovenstående kode vil følgende output:

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

Eksempel Metoder

Vi kan oprette brugerdefinerede helper metoder på skemaet og få adgang til dem via den model instans. Disse metoder vil have adgang til modelobjektet, og de kan bruges ganske kreativt. For eksempel kunne vi oprette en metode til at finde alle de mennesker, der har samme fornavn som den nuværende forekomst.,

i dette eksempel skal vi oprette en funktion til at returnere initialerne for den aktuelle bruger. Lad os tilføje en brugerdefineret hjælper metode kaldet getInitials til skemaet:

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

Denne metode, vil være tilgængelige via en model, eksempel:

Statiske Metoder

der Ligner f.eks metoder, vi kan lave statiske metoder på skemaet., Lad os skabe en metode til at hente alle brugere i databasen:

Opkald getUsers på den Model klasse vil returnere alle brugere i databasen:

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

Tilføjelse eksempel og statiske metoder er en god tilgang til at implementere et interface til databasen interaktioner på samlinger og optegnelser.

Middle .are

Middle .are er funktioner, der kører på bestemte stadier af en rørledning., Mongoose understøtter middleware for følgende operationer:

  • Samlet
  • Dokument
  • Model
  • Query

For eksempel, modeller har pre og post funktioner, der tager to parametre:

  1. Type af hændelse (‘init’, ‘godkend’, ‘gem’, ‘slet’)
  2. Et tilbagekald, der er udført med dette refererer til den model instans
Eksempel på Middleware (en.k.en., præ-og post-kroge)

Lad os prøve med et eksempel ved at tilføje to felter, kaldet createdAt og updatedAt for at vores skema:

Når model.save() kaldes, der er en pre(‘save’, …) og post(‘save’, …) hændelse, der udløses. For den anden parameter kan du passere en funktion, der kaldes, når begivenheden udløses. Disse funktioner tager en parameter til den næste funktion i Middle .are-kæden.,

Lad os tilføje en pre-spar krog og sæt værdier for createdAt og updatedAt:

Lad os oprette og gemme vores model:

Du bør se værdier for createdAt og updatedAt, når den registrering, der er skabt, er trykt:

Plugins

lad os Antage, at vi ønsker at spore, når en rekord blev oprettet og sidst opdateret hver kollektion i vores database. I stedet for at gentage ovenstående proces kan vi oprette et plugin og anvende det på hvert skema.,

Lad os oprette en fil med ./src/model/plugins/timestamp.js og gentage ovenstående funktionalitet som en genanvendelig-modulet:

for At bruge dette plugin, skal vi blot give det til de skemaer, der bør gives denne funktionalitet:

Query Bygning

Desmerdyr, har en meget rig API, der håndterer mange komplekse operationer, der støttes af MongoDB. Overvej en forespørgsel, hvor vi trinvist kan opbygge forespørgselskomponenter.,

I dette eksempel, vil vi:

  1. Find alle brugere
  2. Spring de første 100 poster
  3. Begrænse resultaterne til 10 poster
  4. Sortere resultaterne efter fornavn felt
  5. Vælg fornavn
  6. for at Udføre forespørgsel

Afsluttende

Vi har knap nok ridset i overfladen udforske nogle af de kapaciteter af Desmerdyr. Det er et rigt bibliotek fuld af nyttige og kraftfulde funktioner, der gør det til en glæde at arbejde med datamodeller i applikationslaget.,mens du kan interagere med Mongo direkte ved hjælp af Mongo Driver, vil Mongoose forenkle denne interaktion ved at give dig mulighed for at modellere forhold mellem data og validere dem let.

sjovt faktum: Mongoose er skabt af Valeri Karpov, som er en utrolig talentfuld ingeniør! Han opfandt udtrykket Den gennemsnitlige stak.

hvis denne artikel var nyttig,??? og følg mig på T .itter.

Du kan også lide mit værksted på youtube: Hvordan til at Bygge en REST API, med Node | Hurtig | Mongo