Kaip naudoti „MongoDB + Mongoose“ su „Node.js“ - geriausia „Back End Devs“ praktika

„MongoDB“ neabejotinai yra vienas iš populiariausių „NoSQL“ duomenų bazių pasirinkimų šiandien. Ir ji turi puikią bendruomenę ir ekosistemą.

Šiame straipsnyje apžvelgsime keletą geriausių praktikos pavyzdžių, kurių reikia laikytis nustatant „MongoDB“ ir „Mongoose“ su „Node.js“.

Būtinos šio straipsnio sąlygos

Šis straipsnis yra vienas iš „codedamn“ backend mokymosi kelio, kuriame mes pradedame nuo „backend“ pagrindų ir juos išsamiai aprašome. Todėl manau, kad jau turite šiek tiek patirties su „JavaScript“ (ir „Node.js“).

Šiuo metu mes esame čia:

Jei turite labai mažai patirties su „Node.js“ / „JavaScript“ ar apskritai galine dalimi, tai tikriausiai yra gera vieta pradėti. Čia taip pat galite rasti nemokamus kursus „Mongoose + MongoDB + Node.js“. Pasinerkime.

Kodėl jums reikalingas mongosas?

Norėdami suprasti, kodėl mums reikia „Mongoose“, supraskime, kaip „MongoDB“ (ir duomenų bazė) veikia architektūros lygiu.

  • Jūs turite duomenų bazės serverį (pavyzdžiui, „MongoDB“ bendruomenės serveris)
  • Jūs naudojate „Node.js“ scenarijų (kaip procesą)

„MongoDB“ serveris klausosi TCP lizdo (paprastai), o jūsų „Node.js“ procesas gali prisijungti prie jo naudodamas TCP ryšį.

Tačiau „TCP“ viršuje „MongoDB“ taip pat turi savo protokolą, kad suprastų, ką tiksliai klientas (mūsų „Node.js“ procesas) nori atlikti duomenų bazėje.

Norėdami užmegzti šį ryšį, užuot išmokę pranešimus, kuriuos turime siųsti TCP sluoksnyje, mes juos nutraukiame naudodami „tvarkyklės“ programinę įrangą, šiuo atveju vadinamą „MongoDB“ tvarkykle. Čia „MongoDB“ tvarkyklę galima įsigyti kaip npm paketą.

Dabar nepamirškite, kad „MongoDB“ tvarkyklė yra atsakinga už žemo lygio ryšių užklausų / atsakymų sujungimą ir abstrakciją iš jūsų, tačiau tai jus pasiekia tik kaip kūrėją.

Kadangi „MongoDB“ yra bešemė duomenų bazė, ji suteikia jums daug daugiau energijos, nei jums reikia pradedantiesiems. Didesnė galia reiškia didesnį paviršiaus plotą, kad viskas būtų negerai. Turite sumažinti klaidų ir prispaudimų, kuriuos galite padaryti savo kode, plotą. Jums reikia kažko daugiau.

Susipažink su Mongoose. „Mongoose“ yra vietinio „MongoDB“ tvarkyklės (mano minėto npm paketo) abstrakcija.

Bendra nykščio taisyklė su abstrakcijomis (taip, kaip aš suprantu) yra ta, kad kiekviena abstrakcija jūs prarandate tam tikrą žemo lygio veikimo galią. Bet tai nebūtinai reiškia, kad tai yra blogai. Kartais tai padidina 1000x + našumą, nes jums niekada nereikia turėti visiškos prieigos prie pagrindinės API.

Geras būdas apie tai galvoti yra tai, kad techniškai sukursite pokalbio realiuoju laiku programą tiek C, tiek „Python“.

„Python“ pavyzdį jums, kaip kūrėjui, būtų daug lengviau ir greičiau įdiegti naudojant didesnį produktyvumą.

C gali būti efektyvesnis, tačiau jis turės didžiulį produktyvumo / vystymosi greičio / klaidų / gedimų kainą. Be to, dažniausiai nereikia turėti galios, kurią suteikia „C“, kad įdiegtumėte interneto lizdus.

Panašiai naudodamiesi „Mongoose“ galite apriboti savo žemesnio lygio API prieigos plotą, tačiau atrakinti daug galimo pelno ir gero DX.

Kaip prijungti „Mongoose + MongoDB“

Pirma, greitai pažiūrėkime, kaip turėtumėte prisijungti prie savo „MongoDB“ duomenų bazės 2020 m. Naudodami „Mongoose“:

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

Šis ryšio formatas užtikrina, kad naudojate naują „Mongoose“ URL analizatorių ir nenaudojate nebenaudojamos praktikos. Jei norite, čia galite išsamiai perskaityti visus šiuos nuvertėjimo pranešimus.

Kaip atlikti mangustų operacijas

Dabar eikime į priekį ir greitai aptarkime operacijas su „Mongoose“ ir kaip jas turėtumėte atlikti.

„Mongoose“ suteikia galimybę pasirinkti du dalykus:

  1. Žymeklio užklausos
  2. Visa užklausa

Žymeklio užklausos

Užklausos pagal žymeklį reiškia, kad vienu metu dirbate su vienu įrašu, o iš duomenų bazės vienu metu gaunate vieną ar kelis dokumentų paketus. Tai yra efektyvus būdas dirbti su didžiuliais duomenų kiekiais ribotoje atminties aplinkoje.

Įsivaizduokite, kad turite išanalizuoti 10 GB viso dydžio dokumentus 1 GB / 1core debesies serveryje. Negalite gauti visos kolekcijos, nes tai netiks jūsų sistemoje. Čia žymeklis yra geras (ir vienintelis?) Variantas.

Visas užklausų gavimas

Tai yra užklausos tipas, kai vienu metu gaunate visą atsakymą į savo užklausą. Daugeliu atvejų tai ir naudosite. Todėl čia daugiausia dėmesio skirsime šiam metodui.

Kaip naudoti „Mongoose“ modelius

Modeliai yra „Mongoose“ supervalstybė. Jie padeda įgyvendinti „schemos“ taisykles ir užtikrina vientisą „Node“ kodo integravimą į duomenų bazės skambučius.

Pirmasis žingsnis yra apibrėžti gerą modelį:

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 

Tai yra vienas apipjaustytas pavyzdys tiesiai iš „codedamn“ kodo bazės. Keletas įdomių dalykų, kuriuos turėtumėte atkreipti dėmesį čia:

  1. Stenkitės nepamiršti required: truevisų laukų, kuriuos reikia užpildyti. Tai gali būti didžiulė skausmo taupymo priemonė, jei nenaudojate statinio tipo tikrinimo sistemos, pvz., „TypeScript“, kad padėtumėte teisingiems nuosavybės pavadinimams kuriant objektą. Be to, nemokamas patikrinimas taip pat yra labai šaunus.
  2. Apibrėžkite indeksus ir unikalius laukus. uniqueypatybė taip pat gali būti įtraukta į schemą. Indeksai yra plati tema, todėl čia nesigilinsiu. Tačiau dideliu mastu jie gali jums labai padėti pagreitinti jūsų užklausas.
  3. Aiškiai apibrėžkite kolekcijos pavadinimą. Nors „Mongoose“ gali automatiškai suteikti kolekcijos pavadinimą pagal modelio pavadinimą (pavyzdžiui, Completedčia), mano nuomone, tai yra per daug abstrakcijos. Turėtumėte bent jau žinoti apie savo duomenų bazės pavadinimus ir rinkinius savo kodo bazėje.
  4. Apribokite vertes, jei galite, naudodamiesi enums.

Kaip atlikti CRUD operacijas

CRUD reiškia C reate, R ead, U pdate ir D elete . Tai yra keturios pagrindinės parinktys, kuriomis galite atlikti bet kokį duomenų tvarkymą duomenų bazėje. Greitai pažiūrėkime keletą šių operacijų pavyzdžių.

Sukurti operaciją

Tai tiesiog reiškia naujo įrašo sukūrimą duomenų bazėje. Norėdami sukurti įrašą, naudokime aukščiau apibrėžtą modelį:

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

Vėlgi, keletas patarimų čia:

  1. Vietoje atgalinių skambučių naudokite „async-await“ (malonu akims, nėra jokios novatoriškos veiklos naudos)
  2. Naudokite bandymo sugauti blokus aplink užklausas, nes jūsų užklausa gali nepavykti dėl daugelio priežasčių (pasikartojantis įrašas, neteisinga vertė ir pan.)

Skaitymo operacija

Tai reiškia esamų reikšmių nuskaitymą iš duomenų bazės. tai paprasta, kaip skamba, bet yra keletas gėjų, kurias turėtumėte žinoti su „Mongoose“:

const res = await CompletedSchema.find(info).lean()
  1. Ar galite lean()ten matyti funkcijos iškvietimą? Tai labai naudinga pasirodymui. Pagal numatytuosius nustatymus „Mongoose“ apdoroja grąžintą (-us) dokumentą (-us) iš duomenų bazės ir prideda savo stebuklingus metodus (pavyzdžiui .save)
  2. Kai naudosite .lean(), „Mongoose“ grąžins paprastus JSON objektus, o ne daug atminties ir išteklių turinčius dokumentus. Greičiau ir pigiau užduoda užklausas ir jūsų procesoriuje.
  3. Tačiau galite praleisti, .lean()jei iš tikrųjų galvojate apie duomenų atnaujinimą (tai pamatysime toliau)

Atnaujinimo operacija

Jei jau turite su savimi „Mongoose“ dokumentą (nešaunant .lean()), galite tiesiog pakeisti objektą ir išsaugoti jį naudodami object.save():

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

Atminkite, kad čia atliekami du duomenų bazės skambučiai. Pirmasis yra įjungtas, findOneo antrasis - įjungtas doc.save.

Jei galite, visada turėtumėte sumažinti užklausų, patenkančių į duomenų bazę, skaičių (nes jei lyginate atmintį, tinklą ir diską, tinklas beveik visada yra lėčiausias).

Kitu atveju galite naudoti tokią užklausą:

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

ir tai atliks tik vieną iškvietimą į duomenų bazę.

Operacija „Ištrinti“

„Mongoose“ taip pat paprasta ištrinti. Pažiūrėkime, kaip galite ištrinti vieną dokumentą:

const res = await CompletedSchema.deleteOne()

Kaip ir updateOne, deleteOnetaip pat priima pirmąjį argumentą kaip dokumento atitikties sąlygą.

Taip pat yra dar vienas vadinamas metodas, deleteManykuris turėtų būti naudojamas tik tada, kai žinote, kad norite ištrinti kelis dokumentus.

Bet kokiu kitu atveju visada naudokite, deleteOnekad išvengtumėte atsitiktinio daugkartinio ištrynimo, ypač kai bandote vykdyti užklausas patys.

Išvada

Šis straipsnis buvo paprastas „Node.js“ kūrėjų įvadas į „Mongoose“ ir „MongoDB“ pasaulį.

Jei jums patiko šis straipsnis, galite dar labiau sustiprinti savo žaidimą kaip kūrėjas, eidami „codedamn“ vidinės programos mokymosi kelią. Nedvejodami kreipkitės į mane „Twitter“, jei norite gauti atsiliepimų!