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.
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:
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):
- 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
- hozzon Létre egy ingyenes homokozó adatbázis előfizetés a mLab
- 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.
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
- szám
- ObjectId
- String
vegyes (Generikus / rugalmas adattípus)
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):
- A
_id
mező automatikusan generált által Mongo egy elsődleges kulcs a gyűjtemény. Értéke a dokumentum egyedi azonosítója. - a
email
mező értéke visszatér., Vegye figyelembe, hogy alacsonyabb cased, mert a sémában megadtuk alowercase:true
attribútumot. -
__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:
- az esemény Típusa (‘init’, ‘érvényesítse’, ‘mentés’, ‘eltávolítás’)
- Egy visszahívási, hogy végre ezzel is utalva a modell például
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
ésupdatedAt
a 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:
- keresse meg az összes felhasználó
- Ugrás az első 100 bejegyzések
- szűkítheti a találatokat 10 bejegyzések
- Rendezés az eredményeket, amelyeket a keresztnév mező
- Válassza ki a title
- 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.