11. Výběr, aktualizace a mazání dat
V tomto díle tutoriálu postupně přepíšeme i ostatní endpointy našeho knižního Node.js API tak, aby využívali databázi MongoDB. Z minulého dílu máme zatím hotové vytváření nové knihy. Abychom mohli dnes s daty dále pracovat, bude vhodné mít v naší lokální databázi uloženo několik různých knih. Pokud máme tato data připravena, můžeme se pustit do programování.Jako další endpoint upravíme získávání všech knih, tedy GET /api/books/GetAll. Tato metoda bude opravdu jednoduchá:
app.get('/api/books/GetAll', (request, response) => {
Book.find({}, function(err, data){
response.send(data);
});
});
Nepotřebujeme zde konstruovat žádné podmínky, chceme zkrátka všechny data z kolekce Book. K tomu nám poslouží metoda find a anonymní funkce, která získaná data zpracuje. V našem případě je jednoduše vrátí na výstup.
Dalším endopointem bude získání konkrétní knihy dle jejího unikátního ID. Celá metoda vypadá takto:
app.get('/api/books/:book_id', (request, response) => {
Book.findOne({_id: request.params.book_id}, function(err, data){
if (!data) {
response.status(404).send('Kniha nenalezena');
}
response.send(data);
});
});
Metoda není tolik odlišná od předchozí. Změny jsou dvě. První je přidání omezují podmínky pro výběr dat. V našem případe atribut _id a jako hodnota ID získané ze zaslaného požadavku. Druhou je podmínka pro případ že nebyla nalezena kniha se zadaným ID. V takovém případě je vráceno 404, v opačném pak klasicky data o knize. Pro vyzkoušení se pomocí Compassu podívejte do své databáze, jaké ID bylo některé knize přiděleno. Nejde totiž o lineárně přidělená celá čísla jak můžeme být zvyklý z relačních databází.
Mazání knihy bude podobné jejímu vyhledání. Nejdříve také musíme záznam nalézt a získat a poté ho smažeme.
app.delete('/api/books/:book_id', (request, response) => {
Book.findOne({_id: request.params.book_id}, function(err, data){
if (!data) {
response.status(404).send('Kniha nenalezena');
return;
}
data.remove();
});
response.send();
});
Poslední zbývající metodou našeho API je úprava již existujícího záznamu.
app.put('/api/books/:book_id', (request, response) => {
if (!request.is('json')) {
response.status(415).send('Chybny pozadavek');
return;
}
if (!is_book_valid(request.body)) {
response.status(400).send('Chybna data v pozadavku');
return;
}
Book.findOneAndUpdate({_id: request.params.book_id}, request.body, {new: true}, function(err, data) {
if (!data) {
response.status(404).send('Kniha nenalezena');
return;
}
response.send(data);
});
});
Stejně jako v případě vkládání nového záznamu, máme na začátku kontroly vstupních dat. U těch však neprobíhá žádná změna od minule. Poté zavoláme metodu findOneAndUpdate, kde prvním parametrem je podmínka. Ta je stejná jako v případě získání jednoho záznamu nebo jeho mazání. V druhém parametru předáme objekt s novými hodnotami. Třetím parametrem můžeme nastavovat různý vlastnosti, v našem případě nastavujeme chování tak, aby nám byl vrácen objekt s již novými hodnotami. Bez tohoto nastavení by bylo výchozí chování takové, že bychom získali objekt s daty před jejich aktualizací. Posledním parametrem je anonymní funkce, která zpracovává získaná data. Ta je stejná jako v případě získání jednotlivé knihy. Tedy buď získáme data, nebo chybovou hlášku.
V příštím díle si prohloubíme znalosti o MongoDB. Vytvoříme si kolekce jako složené objekty, jejichž atributy jsou další objekty. Tedy to, co v MongoDB nahazuje spojování tabulek známé z relačních databází.
Další díly tutoriálu
9. Instalace MongoDB a Compass10. Ukládání dat do MongoDB
11. Výběr, aktualizace a mazání dat