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.