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.
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:
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):
- Download passende MongoDB version til dit Operativsystem fra MongoDB Hjemmeside og følg deres instruktioner for installation
- Opret en gratis sandkasse database abonnement på mLab
- 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.
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):
-
_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. - værdien af
email
feltet returneres., Bemærk, at det er lavere i kabinet, fordi vi specificeredelowercase:true
attributten i skemaet. -
__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:
- Type af hændelse (‘init’, ‘godkend’, ‘gem’, ‘slet’)
- Et tilbagekald, der er udført med dette refererer til den model instans
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:
- Find alle brugere
- Spring de første 100 poster
- Begrænse resultaterne til 10 poster
- Sortere resultaterne efter fornavn felt
- Vælg fornavn
- 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.