Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

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 Compass
10. Ukládání dat do MongoDB
11. Výběr, aktualizace a mazání dat