Nick Karnik

Mongoose egy objektum adatmodellezés (ODM) könyvtár MongoDB és csomópont.js. Az adatok közötti kapcsolatokat kezeli, séma validációt biztosít, valamint objektumok kódban történő lefordítására, illetve az objektumok MongoDB-ban való ábrázolására szolgál.

Object Mapping between Node and MongoDB managed via Mongoose

MongoDB is a schema-less NoSQL document database., Ez azt jelenti, hogy JSON dokumentumokat tárolhat benne, ezeknek a dokumentumoknak a szerkezete változhat, mivel nem hajtják végre, mint az SQL adatbázisok. Ez a NoSQL használatának egyik előnye, mivel felgyorsítja az alkalmazásfejlesztést, és csökkenti a telepítések összetettségét.

Az alábbiakban egy példa arra, hogyan tárolják az adatokat Mongo vs. SQL adatbázis:

NoSQL Documents vs., Relációs táblák az SQL-ben

terminológiák

gyűjtemények

“gyűjtemények” a Mongo-ban egyenértékűek a relációs adatbázisok táblázataival. Több JSON dokumentumot is tárolhatnak.

Documents

“Documents” egyenértékű rekordok vagy adatsorok SQL. Míg egy SQL sor hivatkozhat adatokat más táblázatokban, Mongo dokumentumok általában össze, hogy egy dokumentumban.

mezők

“mezők” vagy attribútumok hasonlóak az SQL tábla oszlopaihoz.

séma

míg a Mongo séma nélküli, az SQL egy sémát határoz meg a táblázat definícióján keresztül., A Mongoose “séma” egy dokumentum adatstruktúra (vagy a dokumentum alakja), amelyet az alkalmazási rétegen keresztül hajtanak végre.

Modellek

‘Modell’ vagy magasabb rendű konstruktőri, hogy egy séma, majd hozzon létre egy például egy dokumentum azonos rekordok egy relációs adatbázis.

első lépések

Mongo telepítés

mielőtt elkezdenénk, állítsuk be a Mongo-t., Választhat a következő lehetőségek közül (használjuk opció #1 ezt a cikket):

  1. Töltse le a megfelelő MongoDB változata az Operációs Rendszer a MongoDB Weboldal, majd kövesse a telepítési utasításokat
  2. hozzon Létre egy ingyenes homokozó adatbázis előfizetés a mLab
  3. Telepítés lehetőséget Mongo segítségével Docker, ha szeretné használni docker

vészeljük át az alapokat a Mongúz a végrehajtási egy modellt, ami az adatokat az egyszerűsített címjegyzék.

Visual Studio kódot, Node 8.9-et és NPM 5.6-ot használok., Tűz ki a kedvenc IDE, hozzon létre egy üres projekt, és kezdjük el! Mi lesz a korlátozott ES6 szintaxis Node, így nem lesz konfigurálása Babel.

NPM Telepíteni

menjünk ki a mappát, majd inicializálja a projekt

npm init -y

nézzük telepíteni Mongúz, a felhasználói könyvtár a következő parancsot:

npm install mongoose validator

A fenti telepítési parancs telepíti a legújabb verzió a könyvtárak. A Mongoose szintaxisa ebben a cikkben a Mongoose v5-re vagy azon túlra jellemző.,

adatbázis-kapcsolat

Hozzon létre egy fájlt ./src/database.js a projekt gyökér alatt.

ezután hozzáadunk egy egyszerű osztályt egy olyan módszerrel, amely csatlakozik az adatbázishoz.

a csatlakozási karakterlánc a telepítéstől függően változik.

a require(‘mongoose’) a fenti hívás egy Singleton objektumot ad vissza. Ez azt jelenti, hogy amikor először hívod arequire(‘mongoose’) – t, létrehoz egy példányt a Mongoose osztályból, majd visszaadja., A későbbi hívásoknál ugyanazt a példányt fogja visszaadni, amelyet az ES6 modul import/export működése miatt először hoztak létre, majd visszaküldték Önnek.

Modul import/igényel a munka-flow

Hasonlóképpen, mi lett az Adatbázis osztály egy singleton visszaküldésével az osztály példánya a module.exports nyilatkozatot, mert csak egyetlen kapcsolat, hogy az adatbázisban.,

az ES6 nagyon egyszerűvé teszi számunkra a singleton (egypéldány) minta létrehozását, mivel a modul betöltője egy korábban importált fájl válaszának gyorsítótárazásával működik.

Mongoose Schema vs. Model

a Mongoose modell egy csomagoló a Mongoose séma. A Mongoose séma meghatározza a dokumentum szerkezetét, az alapértelmezett értékeket, a validátorokat stb., míg a Mongoose modell interfészt biztosít az adatbázishoz rekordok létrehozásához, lekérdezéséhez, frissítéséhez, törléséhez stb.

Mongoose modell létrehozása elsősorban három részből áll:

1., Hivatkozás Mongoose

let mongoose = require('mongoose')

Ez a hivatkozás ugyanaz lesz, mint az adatbázishoz való csatlakozáskor, ami azt jelenti, hogy a sémának és a modelldefinícióknak nem kell kifejezetten csatlakozniuk az adatbázishoz.

2. A séma meghatározása

a séma egy objektumon keresztül határozza meg a dokumentum tulajdonságait, ahol a kulcsnév megfelel a gyűjteményben található tulajdonság nevének.,

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

itt definiálunk egy e-mail nevű tulajdonságot egy séma típusú karakterlánccal, amely egy belső validátorra térképez, amely akkor indul el, amikor a modell az adatbázisba kerül. Sikertelen lesz, ha az érték adattípusa nem karakterlánc típus.

a következő Sématípusok engedélyezettek:

  • Array
  • Boolean
  • Buffer
  • Date
  • vegyes (Generikus / rugalmas adattípus)

  • szám
  • ObjectId
  • String

vegyes és ObjectId a require(‘mongoose’).Schema.Types.

3., A modell exportálása

meg kell hívnunk a modell konstruktort a Mongoose példányon, és át kell adnunk a gyűjtemény nevét, valamint a séma definíciójára való hivatkozást.

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

kombináljuk a fenti kódot ./src/models/email.js egy alapvető e-mail modell tartalmának meghatározásához:

a séma meghatározásnak egyszerűnek kell lennie, de összetettsége általában az alkalmazási követelményeken alapul. A sémák újra felhasználhatók, és több gyermek-sémát is tartalmazhatnak. A fenti példában az e-mail tulajdonság értéke egyszerű értéktípus., Ez azonban lehet egy objektumtípus is, amelyen további tulajdonságok találhatók.

létrehozunk egy példányt a modell meghatározott fenti mező kitöltéséhez használja a következő szintaxist:

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

nézzük, fokozza az e-Mail séma, hogy az e-mail ingatlan egyedi, szükséges mezőt, majd konvertálja az értéket kisbetűs mentés előtt. Hozzáadhatunk egy érvényesítési funkciót is, amely biztosítja, hogy az érték érvényes e-mail cím legyen. A korábban telepített validator könyvtárat fogjuk használni.,

Basic Operations

a Mongoose rugalmas API-val rendelkezik, és számos lehetőséget kínál egy feladat elvégzésére. Nem fogunk a variációkra összpontosítani, mert ez nem terjed ki erre a cikkre, de ne felejtsük el, hogy a legtöbb művelet egynél több módon is elvégezhető szintaktikailag vagy az alkalmazás architektúráján keresztül.,

Bejegyzés Létrehozása

hozzunk létre egy példányát az e-mail modell, majd mentse el az adatbázist:

Az eredmény egy dokumentum, amely visszatért a sikeres mentés:

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

Az alábbi mezőket vagy vissza (belső mező-ben egy aláhúzás):

  1. A _id mező automatikusan generált által Mongo egy elsődleges kulcs a gyűjtemény. Értéke a dokumentum egyedi azonosítója.
  2. a email mező értéke visszatér., Vegye figyelembe, hogy alacsonyabb cased, mert a sémában megadtuk a lowercase:true attribútumot.
  3. __v az a versionKey tulajdonság, amelyet a Mongoose először készített minden dokumentumban. Értéke tartalmazza a dokumentum belső felülvizsgálatát.

Ha megpróbálja megismételni a fenti mentési műveletet, hibát fog kapni, mert meghatároztuk, hogy az e-mail mezőnek egyedinek kell lennie.

Fetch Record

próbáljuk meg letölteni azt a rekordot, amelyet korábban elmentettünk az adatbázisba., A modellosztály több statikus és példányos módszert is bemutat az adatbázis műveleteinek elvégzésére. Most megpróbáljuk megtalálni azt a rekordot, amelyet korábban a find módszerrel hoztunk létre, majd az e-mailt Keresési kifejezésként adjuk át.

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

a visszaküldött dokumentum hasonló lesz a rekord létrehozásakor megjelenített dokumentumhoz:

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

frissítési rekord

módosítsuk a fenti rekordot az e-mail cím megváltoztatásával és egy másik mező hozzáadásával, mindezt egyetlen műveletben., Teljesítmény okokból a Mongoose nem küldi vissza a frissített dokumentumot, ezért további paramétert kell megadnunk a kéréshez:

a visszaküldött dokumentum tartalmazza a frissített e-mailt:

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

delete Record

a findOneAndRemove hívás rekord törléséhez., Visszaadja az eltávolított eredeti dokumentumot:

Helpers

megvizsgáltuk a CRUD (Create, Read, Update, Delete) műveletek néhány alapvető funkcióját, de a Mongoose többféle segítő módszer és tulajdonság konfigurálását is lehetővé teszi. Ezek felhasználhatók az adatokkal való munka további egyszerűsítésére.

hozzunk létre egy felhasználói sémát a ./src/models/user.js mezőben afirstName és lastName:

virtuális tulajdonság

egy virtuális tulajdonság nem marad fenn az adatbázisban., Hozzá tudjuk adni a sémánkhoz, mint segítőt, hogy értékeket kapjunk és állítsunk be.

hozzunk létre egy virtuális ingatlan címe fullName, melynek segítségével beállított értékek alapján, a firstName vagy lastName letölteni őket, mint egy kombinált érték, amikor olvastam:

Hívás kap, majd állítsa be kell, hogy használja a function kulcsszóval kell jutni a modell segítségével a this kulcsszó. A fat arrow funkciók használata megváltoztatja azt, amit a this utal.,

Most, tudjuk meg a firstName vagy lastName hozzárendelésével érték fullName:

A fenti kód kimenet a következő:

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

Például Módszerek

készíthetünk egyéni segítő módszerek a séma pedig elérheti őket keresztül a modell például. Ezek a módszerek hozzáférhetnek a modellobjektumhoz, és meglehetősen kreatívan használhatók. Például létrehozhatunk egy módszert, hogy megtaláljuk azokat az embereket, akiknek ugyanaz a keresztneve van, mint az aktuális példánynak.,

ebben a példában hozzunk létre egy funkciót, amely visszaadja az aktuális felhasználó kezdőbetűit. Adjunk hozzá egy getInitials nevű egyéni segítő módszert a sémához:

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

Ez a módszer modellpéldányon keresztül érhető el:

statikus módszerek

hasonló a példány módszerekhez, statikus módszereket hozhatunk létre a sémán., Hozzunk létre egy módszert, hogy letölteni az összes felhasználó az adatbázisban:

hívó getUsers A modell osztály visszaadja az összes felhasználó az adatbázisban:

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

hozzáadása példány és statikus módszerek egy szép megközelítés, hogy végre egy felület adatbázis kölcsönhatások gyűjtemények és rekordok.

Middleware

Middleware olyan funkciók, amelyek futnak bizonyos szakaszaiban a csővezeték., Mongúz támogatja a middleware az alábbi műveletek:

  • Összesített
  • a Dokumentum
  • Modell
  • Lekérdezés

például modellek pre vagy post funkciók két paraméterek:

  1. az esemény Típusa (‘init’, ‘érvényesítse’, ‘mentés’, ‘eltávolítás’)
  2. Egy visszahívási, hogy végre ezzel is utalva a modell például
Példa a Middleware (egy.k.egy.,

próbáljunk ki egy példát a createdAt és updatedAt a sémánkhoz:

amikor model.save()>meg van hívva, van egy pre(‘save’, …)és post(‘save’, …) aktivált esemény. A második paraméterhez átadhat egy függvényt, amelyet az esemény aktiválásakor hívnak. Ezek a funkciók egy paramétert a middleware lánc következő funkciójához vezetnek.,

adjunk hozzá egy pre-save kampót és állítsuk be a createdAt és updatedAt:

hozzuk létre és mentsük el a modellünket:

createdAtésupdatedAta létrehozott rekord kinyomtatásakor:

plugins

tegyük fel, hogy nyomon akarjuk követni, mikor jött létre egy rekord, és utoljára frissítettük adatbázisunk minden gyűjteményében. Ahelyett, hogy megismételnénk a fenti folyamatot, létrehozhatunk egy plugint, amelyet minden sémára alkalmazhatunk.,

hozzunk létre egy fájlt ./src/model/plugins/timestamp.js, majd megismételni a fenti funkciókat, mint egy újrafelhasználható modul:

használja ezt a plugint, akkor egyszerűen csak át, hogy a sémák, meg kell adni ezt a funkciót:

Lekérdezés Épület

Mongúz egy nagyon gazdag API-t, amely kezeli a sok bonyolult műveletek által támogatott MongoDB. Vegyünk egy lekérdezést, ahol fokozatosan építhetünk lekérdezési összetevőket.,

ebben A példában fogjuk, hogy:

  1. keresse meg az összes felhasználó
  2. Ugrás az első 100 bejegyzések
  3. szűkítheti a találatokat 10 bejegyzések
  4. Rendezés az eredményeket, amelyeket a keresztnév mező
  5. Válassza ki a title
  6. Végre, hogy a lekérdezés

Záró

Mi már alig karcos a felület feltárása néhány képességeit Mongúz. Ez egy gazdag könyvtár tele hasznos és erőteljes funkciók, hogy ez egy öröm, hogy működjön együtt adatmodellek az alkalmazás réteg.,

miközben közvetlenül a Mongo Driver segítségével kölcsönhatásba léphet a Mongoose-val, a Mongoose egyszerűsíti ezt az interakciót azáltal, hogy lehetővé teszi az adatok közötti kapcsolatok modellezését, valamint azok egyszerű érvényesítését.

szórakoztató tény: a Mongoose-t Valeri Karpov készítette, aki hihetetlenül tehetséges mérnök! Ő alkotta meg a kifejezést az átlagos verem.

ha ez a cikk hasznos volt,??? és kövess a Twitteren.

lehet, hogy tetszik a műhelyem a youtube-on: Hogyan építsünk egy REST API-t a Node | Express | Mongo