av Nick Karnik

Mongoose er et Objekt Data Modellering (ODM) bibliotek for MongoDB og Node.js. Det klarer relasjoner mellom data, gir skjema validering, og brukes til å oversette mellom objekter i koden og representasjon av disse objektene i MongoDB.

Objekt Mapping mellom Node og MongoDB administrert via Mongoose

MongoDB er en skjema-mindre NoSQL-dokument database., Det betyr at du kan lagre JSON dokumenter i det, og strukturen i disse dokumentene kan variere, så det er ikke håndheves som SQL-databaser. Dette er en av fordelene med å bruke NoSQL som det hastigheter opp program for utvikling og reduserer kompleksiteten av distribusjoner.

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

NoSQL Dokumenter vs., Relasjonell Tabeller i SQL

Terminologier

Samlinger

‘Samlinger» i Mongo er tilsvarende tabeller i relasjonsdatabaser. De kan ha flere JSON dokumenter.

Dokumenter

‘Dokumenter’ er tilsvarende poster eller rader med data i SQL. Mens en SQL rad kan referanse data i andre tabeller, Mongo dokumenter vanligvis sammen i et dokument.

Felt

‘Felt’ eller egenskaper er de samme som kolonner i en SQL-tabellen.

Xml

Mens du er Mongo-skjema-mindre, definerer en SQL-skjema via bordet definisjon., En Mongoose ‘skjema’ er et dokument datastruktur (eller formen på dokumentet) som er implementert via programmet lag.

– Modeller

‘Modeller’ er høyere for konstruktører som tar et skjema og oppretter en forekomst av et dokument tilsvarende poster i en relasjonsdatabase.

Komme i Gang

Mongo Installasjon

Før vi kom i gang, la oss oppsett Mongo., Du kan velge fra ett av følgende alternativer (vi bruker alternativ #1 for denne artikkelen):

  1. Last ned den riktige MongoDB versjon for Operativsystemet ditt fra MongoDB Nettstedet og følge deres instruksjoner for installasjon
  2. Opprette en gratis sandkasse database abonnement på mLab
  3. Installere Mongo ved hjelp av Docker hvis du foretrekker å bruke docker

La oss navigere gjennom noen av de grunnleggende av Mongoose ved å implementere en modell som representerer data for en forenklet adresseboken.

jeg bruker Visual Studio-Koden, Node 8.9, og NPM 5.6., Brann opp din favoritt IDE, opprette en tom prosjektet, og la oss komme i gang! Vi skal bruke den begrensede ES6 syntaks i Node, så vi vil ikke være konfigurere Babel.

NPM Installere

La oss gå til prosjekt-mappen og initialisere vårt prosjekt

npm init -y

La oss installere Mongoose og en validering library med følgende kommando:

npm install mongoose validator

De ovennevnte installere kommandoen vil installere den nyeste versjonen av bibliotekene. Den Mongoose syntaks i denne artikkelen er spesifikke for Mongoose v5 og utover.,

Database Tilkobling

Lag en fil ./src/database.js under prosjektet rot.

Neste, vil vi legge til en enkel klasse med en metode som kobles til databasen.

den forbindelse string vil variere basert på din installasjon.

require(‘mongoose’) ring til ovenfor gir et Enkelt objekt. Det betyr at første gang du ringer require(‘mongoose’), det er å skape en forekomst av Mongoose klasse og tilbake., På påfølgende anrop, vil den gå tilbake samme eksempel som ble opprettet og returnert til deg den første tiden på grunn av hvordan modulen for import/eksport fungerer i ES6.

Modulen import/krever work-flow

på samme måte, vi har slått vår Database klassen i en singleton ved å returnere en instans av klassen i module.exports statement fordi vi bare trenger en enkel tilkobling til databasen.,

ES6 gjør det veldig enkelt for oss å lage en enkelt (enkelt forekomst) mønster på grunn av hvordan module loader fungerer ved caching responsen av en tidligere importerte filen.

Mongoose Skjema vs Modell

En Mongoose-modellen er en wrapper på Mongoose-skjema. En Mongoose skjema definerer strukturen i dokumentet, default verdier, validators, etc. mens en Mongoose-modellen gir et grensesnitt til databasen for å opprette, spørring, oppdatere, slette oppføringer, etc.

Opprette en Mongoose modellen består i hovedsak av tre deler:

1., Referering Mongoose

let mongoose = require('mongoose')

Denne referansen vil være den samme som den som ble returnert når vi koblet til databasen, som betyr skjema og modell definisjoner vil ikke eksplisitt trenger å koble til databasen.

2. Å definere Skjema

Et skjema som definerer dokumentet egenskaper gjennom et objekt der tasten navn tilsvarer eiendom navn i samlingen.,

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

Her definerer vi en eiendom kalt e-post med et skjema type String, som kart til en intern validator som vil bli utløst når modellen er lagret i databasen. Det vil mislykkes hvis data type verdien er ikke en streng type.

følgende Skjema Typer er tillatt:

  • Array
  • Boolean
  • Buffer
  • Dato
  • Blandet (generisk / fleksibel data type)
  • Antall
  • ObjectId
  • String

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

3., Eksportere en Modell

Vi trenger for å ringe modell constructor på Mongoose eksempel og gi det navnet på samlingen, og en referanse til schema definisjon.

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

La oss kombinere koden ovenfor til ./src/models/email.js for å angi innholdet av en grunnleggende e-post modell:

En schema definition bør være enkle, men dens kompleksitet er vanligvis basert på krav til søknad. Skjemaene kan brukes på nytt, og de kan inneholde flere barn-skjemaer for. I eksempelet ovenfor, verdien av e-post eiendom er en enkel verdi type., Men, det kan også være en type objekt med flere egenskaper på det.

Vi kan lage en forekomst av den modellen vi har definert ovenfor, og fylle den med følgende syntaks:

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

La oss forbedre E-post skjema for å gjøre e-posten eiendom en unik, obligatorisk felt og konvertere verdien til små bokstaver før du lagrer den. Vi kan også legge til en validering funksjon som skal sikre at verdien er en gyldig e-postadresse. Vi vil referanse og bruk validator biblioteket har installert tidligere.,

Grunnleggende Operasjoner

Mongoose har en fleksibel API og gir mange måter å utføre en oppgave. Vi vil ikke fokusere på variasjoner fordi det er utenfor rammen for denne artikkelen, men husk at de fleste operasjonene kan gjøres på mer enn én måte enten syntaktisk eller via søknaden arkitektur.,

Opprett Oppføring

La oss opprette en forekomst av e-post modell og lagre den til databasen:

resultatet er et dokument som er tilbake etter et vellykket sparer:

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

følgende felt er returnert (interne felt er innledes med en understrek):

  1. _id – feltet er automatisk generert av Mongo og er en primærnøkkel av samlingen. Verdien er en unik identifikator for dokumentet.
  2. verdi email – feltet er returnert., Legg merke til at det er lavere-cased fordi vi er angitt lowercase:true attributt i skjemaet.
  3. __v er versionKey eiendommen ligger på hvert dokument når de først er opprettet av Mongoose. Verdien inneholder den interne revisjon av dokumentet.

Hvis du prøver å gjenta lagringen ovenfor, vil du få en feilmelding, fordi vi har spesifisert at feltet e-post bør være unik.

Hent Posten

La oss prøve å hente posten vi er lagret i databasen tidligere., Modellen klasse eksponerer flere statiske og forekomst metoder for å utføre operasjoner på databasen. Vi vil nå prøve å finne den posten som vi har opprettet tidligere ved hjelp av finn-metoden, og sende e-post som søkeord.

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

dokumentet som returneres vil være lik det som ble vist da vi opprettet posten:

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

Oppdater ta opp

La oss endre oppføring ovenfor ved å endre e-postadresse og legger til et annet felt til det, alle i en enkelt operasjon., For ytelse grunner, Mongoose vil ikke gå tilbake den oppdaterte dokumentet så vi trenger å passere en ekstra parameter for å be om det:

dokumentet som returneres vil ha oppdatert e-post:

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

Slett Oppføring

Vi vil bruke findOneAndRemove ring for å slette en oppføring., Det gir den opprinnelige dokumentet som ble fjernet:

Hjelpere

Vi har sett på noen av de grunnleggende funksjonalitet ovenfor kjent som CRUD (Create, Read, Update, Delete) operasjoner, men Mongoose gir også mulighet til å konfigurere flere typer helper metoder og egenskaper. Disse kan brukes til å ytterligere forenkle arbeide med data.

La oss opprette en bruker skjema i ./src/models/user.js med feltenefirstName og lastName:

Virtuell Eiendom

En virtuell eiendom er ikke vedvarte til databasen., Vi kan legge det til vårt skjema som en hjelper til å få og å sette verdier.

La oss lage en virtuell eiendom kalt fullName som kan brukes til å angi verdier på firstName og lastName og hente dem som har en samlet verdi når lese:

Tilbakering for få og angi må bruke funksjonen søkeord som vi trenger for å få tilgang modellen via this søkeord. Ved hjelp av fett pil funksjoner som vil endre hva som this refererer til.,

Nå, kan vi sette firstName og lastName ved å tilordne en verdi til fullName:

koden ovenfor vil utgang følgende:

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

Eksempel Metoder

Vi kan lage egendefinerte helper metoder på skjema og få tilgang til dem via modellen eksempel. Disse metodene vil ha tilgang til modellen objekt, og de kan brukes ganske kreativt. For eksempel, kunne vi lage en metode for å finne alle de personer som har samme fornavn som det aktuelle tilfellet.,

I dette eksempel, la oss lage en funksjon for å gå tilbake initialer for den gjeldende brukeren. La oss legge til en egendefinert helper metode som kalles getInitials til skjema:

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

Denne metoden vil være tilgjengelig via en modell eksempel:

Statiske Metoder

Ligner for eksempel metoder, kan vi lage statiske metoder på skjemaet., La oss lage en metode for å hente alle brukere i databasen:

Ringer getUsers på Modellen klasse vil returnere alle brukere i databasen:

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

ved å Legge eksempel og statiske metoder er en fin tilnærming til å gjennomføre et grensesnitt til databasen vekselsvirkningene på samlinger og poster.

Mellomvare

Mellomvare er funksjoner som kjører på bestemte stadier av en rørledning., Mongoose støtter mellomvare for følgende operasjoner:

  • Samlede
  • Dokument
  • Modell
  • Spørring

For eksempel, modeller har pre og post funksjoner som tar to parametre:

  1. Type hendelse (‘init’, ‘bekreft’, ‘lagre’, ‘fjern’)
  2. Et tilbakekall som er utført med dette refererer modellen eksempel
Eksempel på Mellomvare (en.k.a., pre-og post-kroker)

La oss prøve et eksempel ved å legge til to felt kalt createdAt og updatedAt til våre skjema:

Ved model.save() er kalt, det er en pre(‘save’, …) og post(‘save’, …) hendelse som er utløst. For den andre parameteren, kan du sende en funksjon som kalles opp når arrangementet er utløst. Disse funksjonene ta en parameter til neste funksjon i mellomvare-kjeden.,

La oss legge til en pre-lagre krok og angi verdier for createdAt og updatedAt:

La oss opprette og lagre vår modell:

Du bør se verdier for createdAt og updatedAt når posten som er opprettet skrevet ut:

Plugins

la oss si at vi ønsker å spore når en rekord ble opprettet og sist oppdatert hver samling i vår database. I stedet for å gjenta prosessen ovenfor, kan vi lage en plugin og bruke det til ethvert skjema.,

La oss lage en fil ./src/model/plugins/timestamp.js og kopiere over funksjonalitet som en gjenbrukbar modul:

Hvis du vil bruke denne plugin, kan vi bare gi det til skjemaer som bør gis denne funksjonaliteten:

Spørringen Bygningen

Mongoose har en svært rik API som håndterer mange komplekse operasjoner støttes av MongoDB. Vurdere en spørring der vi kan bygge trinnvis spørring komponenter.,

I dette eksempelet skal vi:

  1. Finn alle brukere
  2. Hopp over de første 100 poster
  3. Begrense resultatene til 10 poster
  4. du vil Sortere resultatene etter fornavn-feltet
  5. Velg fornavn
  6. Utføre denne spørringen

Avsluttende

Vi har knapt riper overflaten utforske noen av de evner som er av Mongoose. Det er et rikt bibliotek full av nyttige og kraftige funksjoner som gjør det til en fryd å jobbe med data modeller i programmet lag.,

Mens du kan samhandle med Mongo direkte ved hjelp av Mongo Driver, Mongoose vil forenkle at samhandling ved at du kan modellen relasjoner mellom data og validere dem lett.

Fun Fact: Mongoose er opprettet av Valeri Karpov som er en utrolig dyktig ingeniør! Han innførte begrepet GJENNOMSNITTLIG Stack.

Hvis denne artikkelen var nyttig ??? og Følg meg på Twitter.

Du kan også liker min workshop på youtube: Hvordan Bygge en REST API med Node | Express | Mongo