Kako koristiti MongoDB + Mongoose s Node.js - najbolji postupci za pozadinske programere

MongoDB je nesumnjivo jedan od najpopularnijih izbora baza podataka NoSQL danas. I ima sjajnu zajednicu i ekosustav.

U ovom ćemo članku pregledati neke od najboljih praksi koje treba slijediti kada postavljate MongoDB i Mongoose s Node.js.

Preduvjeti za ovaj članak

Ovaj je članak jedan od dijelova kodiranog pozadinskog puta učenja, gdje polazimo od pozadinskih osnova i detaljno ih pokrivamo. Stoga pretpostavljam da već imate neko iskustvo s JavaScriptom (i Node.js).

Trenutno smo ovdje:

Ako imate vrlo malo iskustva s Node.js / JavaScript ili pozadinom općenito, ovo je vjerojatno dobro mjesto za početak. Ovdje također možete pronaći besplatni tečaj na Mongoose + MongoDB + Node.js. Uronimo.

Zašto ti treba Mongoose?

Da bismo razumjeli zašto nam je potreban Mongoose, shvatimo kako MongoDB (i baza podataka) radi na razini arhitekture.

  • Imate poslužitelj baze podataka (na primjer, poslužitelj MongoDB zajednice)
  • Imate pokrenutu skriptu Node.js (kao postupak)

MongoDB poslužitelj preslušava na TCP utičnici (obično), a vaš se Node.js postupak može povezati s njim pomoću TCP veze.

Ali na vrhu TCP-a, MongoDB također ima vlastiti protokol za razumijevanje što točno klijent (naš proces Node.js) želi da baza podataka radi.

Za ovu komunikaciju, umjesto da učimo poruke koje moramo poslati na TCP sloju, to apstrahiramo uz pomoć softvera "driver", u ovom slučaju nazvanog MongoDB driver. MongoDB upravljački program ovdje je dostupan kao npm paket.

Sjetite se sada, pokretački program MongoDB odgovoran je za vaše povezivanje i apstrahiranje zahtjeva / odgovora za nisku razinu komunikacije - ali ovo vas vodi samo kao programera.

Budući da je MongoDB baza podataka bez sheme, ona vam daje više snage nego što vam je potrebno kao početniku. Više snage znači veću površinu da se stvari poprave. Morate smanjiti površinu bugova i zezanja koje možete unijeti u svoj kod. Trebaš još nešto.

Upoznajte Mongoosea. Mongoose je apstrakcija nad izvornim MongoDB upravljačkim programom (npm paket koji sam gore spomenuo).

Opće pravilo apstrakcija (koliko razumijem) je da sa svakom apstrakcijom izgubite neku operativnu snagu na niskoj razini. Ali to ne mora nužno značiti da je loše. Ponekad poveća produktivnost 1000x + jer ionako zapravo nikada ne morate imati puni pristup osnovnom API-ju.

Dobar način da razmislite o tome je da tehnički izradite aplikaciju za chat u stvarnom vremenu i na C i na Pythonu.

Primjer Pythona bilo bi mnogo lakše i brže za vas kao programera implementirati s većom produktivnošću.

C bi mogao biti učinkovitiji, ali to će imati velike troškove u produktivnosti / brzini razvoja / greškama / padovima. Uz to, uglavnom vam nije potrebna snaga C koja vam daje implementaciju web utičnica.

Slično tome, s Mongooseom možete ograničiti površinu API pristupa niže razine, ali otključati puno potencijalnih dobitaka i dobrog DX-a.

Kako povezati Mongoose + MongoDB

Prvo, brzo ćemo vidjeti kako biste se trebali povezati s bazom podataka MongoDB 2020. godine s Mongooseom:

mongoose.connect(DB_CONNECTION_STRING, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false })

Ovaj format veze osigurava da koristite novi URL Parser tvrtke Mongoose i da ne upotrebljavate zastarjele prakse. Ako želite, ovdje možete detaljno pročitati sve ove poruke o ukidanju.

Kako izvoditi operacije Mongoose

Krenimo sada i brzo razgovarajte o operacijama s Mongooseom i kako biste ih trebali izvesti.

Mongoose vam nudi dvije mogućnosti:

  1. Upit na temelju kursora
  2. Upit za potpuno dohvaćanje

Upit na temelju kursora

Upit temeljen na kurzoru znači da istovremeno radite s jednim zapisom dok iz baze podataka dohvaćate pojedinačni ili skup dokumenata. Ovo je učinkovit način rada s ogromnim količinama podataka u ograničenom memorijskom okruženju.

Zamislite da morate raščlaniti dokumente od 10 GB ukupne veličine na 1 GB / 1core cloud poslužitelju. Ne možete dohvatiti cijelu kolekciju jer to neće stati u vaš sustav. Kursor je ovdje dobra (i jedina?) Opcija.

Potpuno dohvaćanje upita

Ovo je vrsta upita u kojoj odjednom dobivate puni odgovor na vaš upit. To ćete uglavnom koristiti. Stoga ćemo se ovdje uglavnom usredotočiti na ovu metodu.

Kako koristiti Mongoose modele

Modeli su velesila Mongoose. Oni vam pomažu u provođenju pravila "sheme" i pružaju neprimjetnu integraciju koda Node u pozive baze podataka.

Prvi korak je definiranje dobrog modela:

import mongoose from 'mongoose' const CompletedSchema = new mongoose.Schema( { type: { type: String, enum: ['course', 'classroom'], required: true }, parentslug: { type: String, required: true }, slug: { type: String, required: true }, userid: { type: String, required: true } }, { collection: 'completed' } ) CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true }) const model = mongoose.model('Completed', CompletedSchema) export default model 

Ovo je jedan skraćeni primjer izravno iz codedamnove baze podataka. Nekoliko zanimljivih stvari koje biste ovdje trebali primijetiti:

  1. Pokušajte zadržati required: truesva potrebna polja. Ovo vam može uštedjeti ako ne upotrebljavate statički sustav provjere tipa poput Typescripta kako bi vam pomogao s ispravnim imenima svojstava tijekom stvaranja objekta. Uz to je i besplatna provjera super super.
  2. Definirajte indekse i jedinstvena polja. uniquesvojstvo se također može dodati unutar sheme. Indeksi su široka tema, pa ovdje neću ulaziti u dubinu. Ali u velikoj mjeri mogu vam doista pomoći da ubrzate svoje upite.
  3. Izričito definirajte naziv kolekcije. Iako Mongoose može automatski dati naziv kolekcije na temelju imena modela ( Completedovdje, na primjer), ovo je po meni previše apstrakcije. Trebali biste barem znati o imenima i zbirkama baze podataka u vašoj bazi kodova.
  4. Ograničite vrijednosti ako možete, koristeći enume.

Kako izvoditi CRUD operacije

CRUD znači C reate, R EAD, U pdate i D briši. To su četiri temeljne opcije pomoću kojih možete izvršiti bilo koju vrstu manipulacije podacima u bazi podataka. Pogledajmo brzo neke primjere ovih operacija.

Operacija Stvaranje

To jednostavno znači stvaranje novog zapisa u bazi podataka. Upotrijebimo gore definirani model za stvaranje zapisa:

try { const res = await CompletedSchema.create(record) } catch(error) { console.error(error) // handle the error }

Opet, nekoliko uputa ovdje:

  1. Upotrijebite async-await umjesto uzvratnih poziva (lijepo za oko, nema prednosti za performanse kao takve)
  2. Upotrijebite blokove try-catch oko upita jer vaš upit može uspjeti iz više razloga (duplicirani zapis, netočna vrijednost itd.)

Operacija čitanja

To znači čitanje postojećih vrijednosti iz baze podataka. jednostavno je, baš kao što zvuči, ali postoji nekoliko poteškoća koje biste trebali znati s Mongooseom:

const res = await CompletedSchema.find(info).lean()
  1. Možete li tamo vidjeti lean()poziv funkcije? Izvrsno je koristan za izvedbu. Prema zadanim postavkama, Mongoose obrađuje vraćene dokumente iz baze podataka i na njih dodaje svoje čarobne metode (na primjer .save)
  2. Kada koristite .lean(), Mongoose vraća obične JSON objekte umjesto memorije i resursa teških dokumenata. Čini upite bržim i jeftinijim na vašem CPU-u.
  3. Međutim, možete izostaviti .lean()ako zapravo razmišljate o ažuriranju podataka (to ćemo vidjeti dalje)

Operacija ažuriranja

Ako već imate dokument Mongoose sa sobom (bez pucanja sa .lean()), možete jednostavno izmijeniti svojstvo objekta i spremiti ga pomoću object.save():

const doc = await CompletedSchema.findOne(info) doc.slug = 'something-else' await doc.save()

Imajte na umu da su ovdje obavljena dva poziva baze podataka. Prva je uključena, findOnea druga je uključena doc.save.

Ako možete, uvijek biste trebali smanjiti broj zahtjeva koji pogađaju bazu podataka (jer ako uspoređujete memoriju, mrežu i disk, mreža je gotovo uvijek najsporija).

U drugom slučaju možete upotrijebiti ovakav upit:

const res = await CompletedSchema.updateOne(, ).lean()

i izvršit će samo jedan poziv bazi podataka.

Operacija brisanja

Izbriši je također jednostavno s Mongooseom. Pogledajmo kako možete izbrisati jedan dokument:

const res = await CompletedSchema.deleteOne()

Baš kao i updateOne, deleteOneprihvaća i prvi argument kao podudarni uvjet za dokument.

Postoji i druga metoda deleteManykoja se treba koristiti samo kada znate da želite izbrisati više dokumenata.

U svakom drugom slučaju, uvijek koristite deleteOnekako biste izbjegli slučajno višestruko brisanje, posebno kada sami pokušavate izvršiti upite.

Zaključak

Ovaj je članak za programere Node.js bio jednostavan uvod u svijet Mongoose i MongoDB.

Ako vam se svidio ovaj članak, možete još više poboljšati svoju igru ​​kao programer slijedeći codedamn backend put učenja. Slobodno me kontaktirajte na Twitteru za bilo kakve povratne informacije!