podle Nicku Karnik
Mongoose je Objekt Datového Modelování (ODM) knihovna pro MongoDB a Uzel.js. Spravuje vztahy mezi daty, poskytuje validaci schématu a používá se k překladu mezi objekty v kódu a reprezentace těchto objektů v MongoDB.
MongoDB je schéma-méně NoSQL databáze dokumentů., To znamená, že v něm můžete ukládat dokumenty JSON a struktura těchto dokumentů se může lišit, protože není vynucena jako databáze SQL. To je jedna z výhod používání NoSQL, protože urychluje vývoj aplikací a snižuje složitost nasazení.
Níže je příklad toho, jak jsou data uložena v Mongo vs. SQL Databáze:
Terminologie
Kolekce
„Sbírek“ v Mongo jsou ekvivalentem tabulky v relační databázi. Mohou mít více dokumentů JSON.
dokumenty
‚dokumenty‘ jsou ekvivalentní záznamům nebo řadám dat v SQL. Zatímco řádek SQL může odkazovat data v jiných tabulkách, dokumenty Mongo to obvykle kombinují v dokumentu.
pole
‚pole‘ nebo atributy jsou podobné sloupcům v tabulce SQL.
schéma
zatímco Mongo je schéma méně, SQL definuje schéma pomocí definice tabulky., Mongoose „schéma“ je struktura dat dokumentu (nebo tvar dokumentu), která je vynucena pomocí aplikační vrstvy.
modely
‚modely‘ jsou konstruktory vyššího řádu, které mají schéma a vytvářejí instanci dokumentu ekvivalentní záznamům v relační databázi.
Začínáme
instalace Mongo
než začneme, pojďme nastavit Mongo., Můžete si vybrat z jedné z následujících možností (jsme pomocí option #1 pro tento článek):
- Stáhnout příslušný MongoDB verze pro váš Operační Systém z MongoDB webové Stránky a řídit se jejich pokyny k instalaci
- Vytvořte si zdarma sandbox databáze předplatné na stavebnice mlab
- Nainstalovat Mongo pomocí Docker pokud dáváte přednost použití docker
Nechat je procházet některé základy Mongoose prováděcím model, který představuje data pro zjednodušený adresáře.
Používám Visual Studio Code, Node 8.9 a NPM 5.6., Oheň své oblíbené IDE, vytvořit prázdný projekt,a pojďme začít! Budeme používat omezenou ES6 syntaxi v uzlu, takže nebudeme konfigurovat Babel.
NPM Install
vraťme se do složky projektu a inicializovat náš projekt
npm init -y
Pojďme nainstalujte Mongoose a validace knihovna s následujícím příkazem:
npm install mongoose validator
výše uvedené nainstalovat příkaz nainstaluje nejnovější verzi knihovny. Syntaxe Mongoose v tomto článku je specifická pro Mongoose V5 a dále.,
připojení k databázi
Vytvořte soubor ./src/database.js
pod kořenem projektu.
dále přidáme jednoduchou třídu s metodou, která se připojí k databázi.
váš řetězec připojení se bude lišit v závislosti na vaší instalaci.
require(‘mongoose’)
volání výše vrací objekt Singleton. Znamená to, že při prvním volání require(‘mongoose’)
vytváří instanci třídy Mongoose a vrací ji., Při následných hovorech vrátí stejnou instanci, která byla vytvořena a vrácena poprvé kvůli tomu, jak modul import/export funguje v ES6.
Podobně, jsme se obrátili naše Databáze do třídy singleton tím, že vrací instanci třídy v module.exports
prohlášení, protože potřebujeme pouze jediné připojení k databázi.,
ES6 nám velmi usnadňuje vytvoření vzoru singleton (single instance) kvůli tomu, jak modul loader funguje uložením odpovědi dříve importovaného souboru do mezipaměti.
schéma Mongoose vs. Model
Model Mongoose je obal na schématu Mongoose. Schéma Mongoose definuje strukturu dokumentu, výchozí hodnoty, validátory atd., zatímco model Mongoose poskytuje rozhraní k databázi pro vytváření, dotazování, aktualizaci, mazání záznamů atd.
vytvoření modelu Mongoose se skládá především ze tří částí:
1., Odkazování Mongoose
let mongoose = require('mongoose')
Tento odkaz bude stejný jako ten, který se vrátil, když jsme připojeni k databázi, což znamená, že schéma a model definic se není třeba explicitně připojit k databázi.
2. Definování schématu
schéma definuje vlastnosti dokumentu prostřednictvím objektu, kde název klíče odpovídá názvu vlastnosti ve sbírce.,
let emailSchema = new mongoose.Schema({ email: String})
zde definujeme vlastnost nazvanou e-mail s řetězcem typu schématu, který mapuje interní validátor, který bude spuštěn při uložení modelu do databáze. Selže, pokud datový typ hodnoty není typ řetězce.
následující Schéma Typů jsou povoleny:
- Pole
- Boolean
- Buffer
- Datum
- Smíšené (obecný / flexibilní, typ dat)
- Počet
- ObjectId
- String
Smíšené a ObjectId jsou definována v require(‘mongoose’).Schema.Types
.
3., Export modelu
musíme zavolat konstruktoru modelu na instanci Mongoose a předat mu název kolekce a odkaz na definici schématu.
module.exports = mongoose.model('Email', emailSchema)
řekněme, kombinovat výše uvedený kód do ./src/models/email.js
definovat obsah základní model e-mail:
definice schématu by měl být jednoduchý, ale jeho složitost je obvykle založena na požadavcích aplikace. Schémata mohou být znovu použity a mohou obsahovat i několik dětských schémat. Ve výše uvedeném příkladu je hodnota vlastnosti e-mailu jednoduchým typem hodnoty., Může to však být také typ objektu s dalšími vlastnostmi.
můžeme vytvořit instanci modelu jsme definovali výše, a naplnit ji pomocí následující syntaxe:
let EmailModel = require('./email')let msg = new EmailModel({ email: '[email protected]'})
Pojďme zvýšit E-mail schématu, aby se e-mail vlastnost jedinečný, povinné pole a převést hodnotu na malá písmena před uložením. Můžeme také přidat ověřovací funkci, která zajistí, že hodnota je platná e-mailová adresa. Budeme odkazovat a používat knihovnu validator nainstalovanou dříve.,
základní operace
Mongoose má flexibilní API a poskytuje mnoho způsobů, jak splnit úkol. Nebudeme se soustředit na variace, protože to je mimo rozsah tohoto článku, ale nezapomeňte, že většina operací může být provedena ve více než jedním způsobem, a to buď syntakticky nebo přes aplikační architektury.,
Vytvořit Záznam
Pojďme vytvořit instanci model e-mail a uložit jej do databáze:
výsledkem je dokument, který se vrátil po úspěšném uložení:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
následující pole jsou vráceny (vnitřní pole jsou označeny s podtržítkem):
-
_id
pole je auto-generované Mongo a je primárním klíčem kolekce. Jeho hodnota je jedinečným identifikátorem dokumentu. - vrací se hodnota pole
email
., Všimněte si, že je nižší, protože jsme zadali atributlowercase:true
ve schématu. -
__v
je versionKey vlastnost nastavit na každý dokument, když nejprve vytvořeny Mongoose. Jeho hodnota obsahuje interní revizi dokumentu.
Pokud se pokusíte opakovat operaci uložení výše, dostanete chybu, protože jsme určili, že pole e-mailu by mělo být jedinečné.
načíst záznam
zkusme načíst záznam, který jsme dříve uložili do databáze., Modelová třída odhaluje několik statických a instančních metod pro provádění operací v databázi. Nyní se pokusíme najít záznam, který jsme dříve vytvořili pomocí metody find, a předat e-mail jako hledaný výraz.
EmailModel .find({ email: '[email protected]' // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
dokument vrácen, bude podobné tomu, co bylo zobrazeno, když jsme vytvořili rekord:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
Aktualizovat Záznam
řekněme, upravit záznam nad změnou e-mailové adresy a přidat další pole, to vše v jediné operaci., Z výkonnostních důvodů, Mongoose nevrátí aktualizovaný dokument, tak musíme složit další parametr se zeptat na to:
dokument vrácen bude obsahovat aktualizovaný e-mail:
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
Odstranit Záznam
použijeme findOneAndRemove
volání chcete-li odstranit záznam., Vrátí se původní dokument, který byl odstraněn:
Pomocníci
podívali Jsme se na některé základní funkce, výše známý jako CRUD (Create, Read, Update, Delete) operace, ale Mongoose také poskytuje možnost konfigurovat několik typů helper metody a vlastnosti. Ty mohou být použity k dalšímu zjednodušení práce s daty.
Pojďme vytvořit uživatelské schéma v ./src/models/user.js
s polifirstName
lastName
:
Virtuální Majetek
virtuální majetek není přetrvával do databáze., Můžeme jej přidat do našeho schématu jako pomocníka pro získání a nastavení hodnot.
Pojďme vytvořit virtuální majetek se nazývá fullName
, který může být použit k nastavení hodnot na firstName
lastName
a načíst je jako kombinované hodnoty při čtení:
zpětná Volání pro získání a nastavení musí použít klíčové funkce, jak budeme potřebovat pro přístup k modelu přes this
klíčové slovo. Pomocí funkce fat arrow se změní to, cothis
odkazuje.,
Nyní, můžeme nastavit firstName
lastName
přiřazením hodnoty do prvku fullName
:
výše uvedený kód bude výstup následující:
{ _id: 5a7a4248550ebb9fafd898cf, firstName: 'Thomas', lastName: 'Anderson' } Thomas Anderson
Metody Instance
můžeme vytvořit vlastní helper metody na schématu a přístup k nim prostřednictvím modelu instance. Tyto metody budou mít přístup k objektu modelu a mohou být použity docela kreativně. Mohli bychom například vytvořit metodu, jak najít všechny lidi, kteří mají stejné křestní jméno jako aktuální instance.,
v tomto příkladu vytvoříme funkci pro návrat iniciál pro aktuálního uživatele. Pojďme přidat vlastní pomocné metody, která se nazývá getInitials
schématu:
userSchema.methods.getInitials = function() { return this.firstName + this.lastName}
Tato metoda bude přístupné prostřednictvím modelu instance:
Statické Metody
Podobné metody instance, můžeme vytvořit statické metody na schématu., Pojďme vytvořit metodu pro načtení všech uživatelů v databázi:
Volat getUsers
na Modelu třídy vrátí všechny uživatele v databázi:
UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })
Přidání instance a statické metody je pěkný přístup k implementaci rozhraní pro databáze interakcí na sbírky a záznamy.
Middleware
Middleware jsou funkce, které běží v určitých fázích potrubí., Mongoose podporuje middleware pro následující operace:
- Celek
- Dokumentu
- Model
- Dotaz
například, modely pre
post
funkce, které přijmout dva parametry:
- Typ události (‚init‘, ‚ověřit‘, ‚uložit‘, ‚odstranit‘)
- zpětné volání, která je provedena s touto odkazující na model instance
Pojďme zkusit příklad tím, že přidá dvě pole s názvem createdAt
updatedAt
do našeho schématu:
Když model.save()
se nazývá, tam je pre(‘save’, …)
post(‘save’, …)
případě, že je spuštěna. U druhého parametru můžete předat funkci, která se vyvolá při spuštění události. Tyto funkce mají parametr na další funkci v řetězci middleware.,
Pojďme přidat pre-uložit háček a nastavte hodnoty pro createdAt
updatedAt
:
Pojďme si vytvořit a uložit náš model:
měli Byste vidět hodnoty pro createdAt
updatedAt
když se záznam, který je vytvořen je vytištěno:
Pluginy
Předpokládejme, že chceme sledovat, kdy byl záznam vytvořen a naposledy aktualizován každé sbírky v naší databáze. Namísto opakování výše uvedeného procesu můžeme vytvořit plugin a aplikovat ho na každé schéma.,
Pojďme vytvořit soubor ./src/model/plugins/timestamp.js
a zopakovat výše uvedené funkce jako opakovaně použitelný modul:
Chcete-li použít tento plugin, jsme jednoduše předat ji schémata, která by měla být věnována této funkce:
Dotaz Budovy
Mongoose má velmi bohaté API, které zpracovává mnoho složitých operací podporovaných MongoDB. Zvažte dotaz, kde můžeme postupně vytvářet komponenty dotazu.,
V tomto příkladu, budeme:
- Najít všechny uživatele
- Přeskočit první 100 záznamů
- Omezit výsledky na 10 záznamů
- Seřadit výsledky podle pole jméno
- Vyberte jméno
- Spustit tento dotaz
a Zavírání
Jsme se sotva dotkli povrchu prozkoumat některé z možností Mongoose. Je bohatá knihovna plná užitečných a výkonných funkcí, které je radost pracovat s modely dat v aplikační vrstvě.,
zatímco s Mongo můžete komunikovat přímo pomocí ovladače Mongoose, Mongoose tuto interakci zjednoduší tím, že vám umožní modelovat vztahy mezi daty a snadno je ověřit.
Fun Fact: Mongoose je vytvořen Valeri Karpov, který je neuvěřitelně talentovaný inženýr! Vytvořil termín střední zásobník.