2. diel - Real-time kniha návštev - Databáza a CRUD
V minulej lekcii, Real-time kniha návštev - Príprava prostredia pre projekt , sme si urobili kratučký úvod do Node.js, zoznámili sa s novým projektom a nainštalovali si prvé potrebný balíček pre projekt.
V tejto lekcii sa zameriame na server a jeho prístup do databázy.
Databázy
Pre správu databázy budeme potrebovať softvér MongoDB Compass, ak ho
ešte nemáte stiahnite
si ho a nainštalujte. Po úspešnom stiahnutí a inštalácii budeme ešte
potrebovať vytvoriť nový klaster. To docielime pomocou MongoDB
Atlasu. Na ten sa dostaneme zapnutím Compass a stlačením na tlačidlo
Create Free Cluster vpravo:

Klikneme na zelené tlačidlo GET STARTED FREE a založíme si
účet. Po registrácii by sme mali byť na tejto stránke:

Klikneme vpravo na tlačidlo Create a Cluster. Potom budeme mať
na výber poskytovateľa a región. Vyberte ľubovoľne, odporúčam vybrať
najbližšie k vášmu bydlisku, napr. Ireland od poskytovateľa AWS. Úplne na
konci si budeme môcť pomenovať tento Cluster zadarmo. Názov budeme vyberať
v zozname klastrov, ale ak budeme používať iba FREE verziu (čo v rámci
kurzu budeme), jednoducho cluster rozpoznáme. Nakoniec klikneme na tlačidlo
dole Create a Cluster. Teraz sa nám bude vytvárať a
konfigurovať databázy, čo môže zabrať niekoľko minút. Po chvíľke sa
všetko pripraví:

Pre pripojenie ku klastra budeme potrebovať tzv.
Connection String. Ten získame v Atlasu kliknutím na tlačidlo
Connect. Teraz si musíme nastaviť zabezpečenie, kto sa bude
môcť pripojiť do našej databázy. Pre jednoduchosť môžeme vložiť
súčasnú IP adresu kliknutím na tlačidlo
Add Your Current IP Address a potom potvrdiť kliknutím na
tlačidlo Add IP address. Ak nemáte statickú IP od poskytovateľa
a mení sa, budete musieť túto IP neustále meniť alebo nastavte prístup
odkiaľkoľvek kliknutím na Allow Access from Anywhere:

Ako druhý krok musíme vytvoriť prihlasovacie meno a heslo. Zvoľte podľa
ľubovôle ale údaje si niekam napíšte alebo pamätajte. Užívateľa
vytvoríme tlačidlom Create Database User. Nakoniec môžeme
konečne zvoliť metódu pre pripojenie tlačidlom vpravo dole
Choose a connection method. Klikneme na poslednú možnosť
Connect using MongoDB Compass a tlačidlom Copy alebo
ručne skopírujeme Connection String. Skopírovanú URL vložíme do
Compass (samozrejme nezabudnime nahradiť <password> svojim
heslom). URL bude vyzerať napríklad takto:
mongodb+srv://itnetwork:[email protected]/test
Teraz by sme sa mali tlačidlom CONNECT dostať do správy
klastra. Teraz vytvoríme novú databázu a to cez tlačidlo
CREATE DATABASE, pomenovať ju môžeme ako chceme, ja ju pomenujem
ITnetwork. Druhé textové pole je názov pre kolekciu (kolekcia v
MongoDB je niečo ako tabuľka v MySQL), tú pomenujeme treba
posts. V tejto chvíli nemáme v kolekcii posts nič,
to hneď napravíme. Klikneme na kolekciu posts a potom na
tlačidlo ADD DATA > Insert Document vložíme
toto:
{ "name": "2tix", "email": "[email protected]", "message": "Ahoj", "date": "26. 1. 2021" }
Dokument vložíme do databázy.
Dáta sú uchovávané vo formáte JSON (J ava S Cripta O bject N otation). Ak sme všetko urobili správne, mala by naša kolekcia vyzerať takto:

Server
Databáze máme síce hotovú, my do nej ale budeme chcieť zapisovať z
JavaScriptu. Otvoríme si teda zložku Server v našom projekte a
tu vytvoríme nový súbor server.js. Otvoríme ho a hneď na
začiatku definujme konštantu url, tá bude uchovávať connection
string z MongoDB (spôsob jeho získania bude rovnaký ako u Compass, len miesto
Connect using MongoDB Compass, zvolíme
Connect your application):
const url = "mongodb+srv://itnetwork:<password>@itnetworkcluster.y8exk.mongodb.net/<dbname>?retryWrites=true&w=majority";
<password> zase nahradíme svojím heslom au konca
<dbname> nahradíme názvom našej databázy (u mňa
ITnetwork):
const url = "mongodb+srv://itnetwork:[email protected]/ITnetwork?retryWrites=true&w=majority";
Pre prístup do MongoDB musíme ešte nainštalovať knižnicu príkazom:
npm i mongodb --save
Teraz túto knižnicu využijeme, uložíme si jej do konštanty:
const MongoClient = require("mongodb").MongoClient;
K databáze sa pripojíme pomocou:
MongoClient.connect(url,(err,client) => {
});
Funkcia connect berie ako prvý argument Connection
string a ako druhý funkciu (callback). Náš callback má tiež
dva argumenty - err (chybu) a client, cez tento objekt sa budeme pripájať k
databáze. Do callbacku vložme nasledujúci kód:
MongoClient.connect(url,(err,client) => { if(err) throw err; console.log("Database connected..."); const posts = client.db("ITnetwork").collection("posts"); });
Prvý riadok vyhodí chybu, ak nejaká je. Druhý nám vypíše, že je
server pripojený k databáze a tretí získa kolekciu posts z
databázy ITnetwork a uloží ju do konštanty
posts.
Čítania
Ak skúsime vypísať kolekciu takto:
console.log(posts);
Aplikácia vypíše veľa dlhý objekt, ktorý rozhodne nezodpovedá tomu, čo v kolekcii máme. Pre správny výpis všetkých dokumentov v kolekcii použijeme:
posts.find().toArray((err, data) => { if (err) throw err; for(const doc of data){ console.log(doc); } });
Tu posts.find().toArray() dáva funkciu, ktorú berie ako
argument premennú data, teda list všetkých dokumentov v
kolekcii. My potom vo cykle for-of vypíšeme všetky tieto
dokumenty.
Celý náš kód bude teda vyzerať takto (URL si zmeňte na svoju):
const url = "mongodb+srv://itnetwork:[email protected]/ITnetwork?retryWrites=true&w=majority"; const MongoClient = require("mongodb").MongoClient; MongoClient.connect(url,(err,client) => { if(err) throw err; console.log("Database connected..."); const posts = client.db("ITnetwork").collection("posts"); posts.find().toArray((err, data) => { if (err) throw err; for(const doc of data){ console.log(doc); } }); });
Teraz si aplikáciu skúsime príkazom node server.js z
priečinka Server/. Aplikácia vypíše niečo takéto:
Database connected... { _id: 600fd6dc545496255c10b83c, name: '2tix', email: '[email protected]', message: 'Ahoj', date: '26. 1. 2021' }
Všimnime si, že nám MongoDB pridala do dokumentu _id (to
budete mať samozrejme odlišné), ktoré slúžia k indexáciu dokumentov.
Ešte než sa vrhneme na zápis do databázy, pozrime sa bližšie na funkciu
find(). My ju tu používame bez parametrov, ale ak chcete
napríklad zobraziť len správy vytvorené dňa 26. 1. 2021,
môžeme správy filtrovať:
posts.find({date: "26. 1. 2021"}).toArray((err, data) => { if (err) throw err; for(const doc of data){ console.log(doc); } });
Ak chceme nájsť v databáze len jeden dokument, môžeme použiť funkciu
findOne():
posts.findOne({date: "26. 1. 2021"}, (err,doc) => { if (err) throw err; if(doc) console.log(doc); else console.log("Document was not found!"); });
Zapisovanie
Zápis do databázy prevedieme metódou posts.insertOne():
posts.insertOne({ name: "John Doe", email: "[email protected]", message: "Ahojky", date: "26. 1. 3021" });
Skúsme znova zapnúť server.js.
Ak sa teraz pozrieme do Compass, môžeme vidieť, že sa náš dokument
naozaj vložil. Ak sa nový záznam nepridal, skúste najskôr aktualizovať
databázu kliknutím na tlačidlo Refresh úplne napravo v MongoDB
Compass.
Editácia
Dáta v databáze budeme upravovať podobne, ako vkladať:
posts.update({ name: "John Doe" }, { $set: { name: "2tix" } });
Prvý argument metódy update() je filter (funguje rovnako ako u
metódy insert() / insertOne()), druhý je objekt
obsahujúci ďalší objekt $set, do ktorého vždy píšeme, aký
z atribútov dokumentu chceme zmeniť a na čo. Opäť tu môžeme použiť
metódu updateOne(), jediný rozdiel je, že metóda
updateOne() upraví len prvý nájdený
dokument.
Odstraňovanie
Na odstraňovanie slúži metóda deleteMany(). Tá je asi
najjednoduchšie, pretože berie len jeden argument - filter (opäť úplne
rovnaký ako u metód update() a insert()):
posts.deleteMany({ name: "2tix" });
A aj tu sa dá použiť metóda deleteOne():
posts.deleteMany({ name: "2tix" });
Funkcia then()
Na všetkých metódach MongoDB (find() / insert()
/ update() / delete()) môžeme zavolať funkciu
.then(), ktorá opäť berie ako argument callback:
posts.deleteOne({name: "2tix"}).then(() => { console.log("Deleted..."); });
Záver
V tejto lekcii sme sa naučili vytvárať MongoDB databázu a používať
CRUD operácie (C reate - insert(),
R ead - find(), U pdate -
update(), D élet - delete()). Celý
dnešný kód by mal vyzerať nasledovne:
const url = "connectionString"; const MongoClient = require("mongodb").MongoClient; MongoClient.connect(url, {useUnifiedTopology: true}, (err, client) => { if (err) throw err; console.log("Database connected..."); const posts = client.db("ITnetwork").collection("posts"); posts.find({date: "26. 1. 2021"}).toArray((err, data) => { if (err) throw err; for (const doc of data) { console.log(doc); } }); posts.insertOne({ name: "John Doe", email: "[email protected]", message: "Ahojky", date: "26. 1. 3021" }); posts.updateOne({ name: "John Doe" }, { $set: { name: "2tix" } }); posts.deleteOne({name: "2tix"}).then(() => { console.log("Deleted..."); }); posts.findOne({date: "26. 1. 2021"}, (err,doc) => { if (err) throw err; if(doc) console.log(doc); else console.log("Document was not found!"); }); });
V ďalšej lekcii, Real-time kniha návštev - Server , si naprogramujeme náš server v Node.js pomocou Socket.io.
