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.

Objekt Mapování mezi Uzel a MongoDB podařilo přes Mongoose

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:

NoSQL Dokumenty vs., Relační Tabulky v SQL

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):

  1. 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
  2. Vytvořte si zdarma sandbox databáze předplatné na stavebnice mlab
  3. 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.

Modul import/vyžadují work-flow

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):

  1. _id pole je auto-generované Mongo a je primárním klíčem kolekce. Jeho hodnota je jedinečným identifikátorem dokumentu.
  2. vrací se hodnota poleemail., Všimněte si, že je nižší, protože jsme zadali atribut lowercase:true ve schématu.
  3. __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:

  1. Typ události (‚init‘, ‚ověřit‘, ‚uložit‘, ‚odstranit‘)
  2. zpětné volání, která je provedena s touto odkazující na model instance
Příklad Middleware (.k.a., pre a post háčky)

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:

  1. Najít všechny uživatele
  2. Přeskočit první 100 záznamů
  3. Omezit výsledky na 10 záznamů
  4. Seřadit výsledky podle pole jméno
  5. Vyberte jméno
  6. 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.

pokud byl tento článek užitečný, ??? a Následujte mě na Twitteru.

můžete také rád mé dílny na youtube: Jak se staví REST API s Node | Express | Monga