LEKCJA 06 - EXPRESS (p) - baza NeDB /updated 22.11/

LEKCJA 06 - EXPRESS (p) - baza NeDB /updated 22.11/
ukryj menu
SPEC
aktualizacja: 2021-11-24 13:50:56
Uwaga - projekt będzie oceniony przed końcem semestru



1. Bazy NoSQL- informacje ogólne

https://en.wikipedia.org/wiki/NoSQLkopiuj

NeDB - instrukcje są takie jak w większym serwerowym systemie bazodanowym MongoDB
Nadaje się do przechowania nietabelarycznych danych czyli obiektów
Wielkość do 1GB


typowe nazewnictwo:

kolekcje - odpowiedniki tabel w bazach sql
dokumenty - odpowiedniki rekordów w bazach sql


2. NeDB - start pracy

npm install nedbkopiuj

dokumentacja

https://www.npmjs.com/package/nedb
https://github.com/louischatriot/nedb


w pustym pliku serwer01.js dodaj tylko:

const Datastore = require('nedb')

const coll1 = new Datastore({
    filename: 'kolekcja.db',
    autoload: true
});kopiuj


dokument, czyli obiekt z danymi

const doc = {
    a: "a",
    b: "b"
};kopiuj


INSERT - dodanie danych do kolekcji

coll1.insert(doc, function (err, newDoc) {
    console.log("dodano dokument (obiekt):")
    console.log(newDoc)
    console.log("losowe id dokumentu: "+newDoc._id)
});kopiuj


Uwaga: NeDB automatycznie dodaje pole o nazwie _id, jeśli go jawnie nie podamy, i tak powinno pozostać

Wystartuj serwer

3. Operacje na bazie NeDB - do przetestowania

dalej w tym samym pliku server01.js


Uwaga: wszystkie poniższe testy bazy NeDB wykonaj bez użycia żadnych stron html, tylko po stronie serwera, jak w ćwiczeniu 1

a) wstawienie wielu dokumentów do kolekcji

console.log("PRZED FOR: " + new Date().getMilliseconds())
for (var i = 0; i < 3; i++) {
    var doc = {
        a: "a"+i,
        b: "b"+i
    };
    coll1.insert(doc, function (err, newDoc) {
        console.log("id dokumentu: " + newDoc._id, "DODANO: " + new Date().getMilliseconds())
    });
}
console.log("PO FOR: " + new Date().getMilliseconds())kopiuj


Uwaga: zobacz kolejność wyświetlania milisekund


b) pobranie jednego dokumentu z kolekcji

podmień _id na swoje z kolekcji

coll1.findOne({ _id: 'HUIr4XfP2hQX9vfa' }, function (err, doc) {
    console.log("----- obiekt pobrany z bazy: ",doc)
    console.log("----- formatowanie obiektu js na format JSON: ")
    console.log(JSON.stringify(doc, null, 5))
});kopiuj


c) pobranie wszystkich dokumentów z kolekcji

coll1.find({ }, function (err, docs) {
    //zwracam dane w postaci JSON
    console.log("----- tablica obiektów pobrana z bazy: \n")
    console.log(docs)
    console.log("----- sformatowany z wcięciami obiekt JSON: \n")
    console.log(JSON.stringify({ "docsy": docs }, null, 5))
});kopiuj


d) pobranie wielu dokumentów z warunkiem

coll1.find({ a: "a1" }, function (err, docs) {    
    console.log(JSON.stringify({ "docsy": docs }, null, 5))
});kopiuj


e) pobranie liczby dokumentów

coll1.count({}, function (err, count) {
    console.log("dokumentów jest: ",count)
});kopiuj


f) pobranie liczby dokumentów z warunkiem

coll1.count({ a: "a1" }, function (err, count) {
    console.log("dokumentów jest: ",count)
});kopiuj


g) usunięcie pierwszego napotkanego dokumentu spełniającego warunek

coll1.remove({ a:"a2" }, {}, function (err, numRemoved) {
    console.log("usunięto dokumentów: ",numRemoved)
});kopiuj


h) usunięcie wszystkich dokumentów spełniających warunek

coll1.remove({ a:"a1" }, { multi: true }, function (err, numRemoved) {
    console.log("usunięto dokumentów: ",numRemoved)
});kopiuj


i) usunięcie wszystkich dokumentów z kolekcji

coll1.remove({}, { multi: true }, function (err, numRemoved) {
    console.log("usunięto wszystkie dokumenty: ",numRemoved)  
});kopiuj



4. Ćwiczenie - zapis/odczyt rekordów do bazy wysłanych z formularza


utwórz plik serwer02.js

- wstaw do formularza (hbs) cztery inputy (checkbox)
- po wysłaniu formularza do bazy dodają się informacje "TAK" lub "NIE"  w zależności od zaznaczenia checkboxa
- zaraz po dodaniu, pobieraj z bazy wszystkie obiekty i wyświetlaj w postaci tabeli HTML na tej samej stronie, z użyciem handlebars

Uwaga: do sprawdzania danych z checkboxów użyj skróconego if-a, konstruując obiekty do zapisu w bazie danych, jak poniżej:


let obj = {
   a: x==2 ? "iks równa się 2" : "iks nie równa się dwa",
   b: y==2 ? "igrek równa się 2" : "igrek nie równa się dwa",
}kopiuj


czytanie danych z obiektu (nie tablicy)

let obj = {
    a: 1,
    b: 2,
    c: 3
}kopiuj


czytanie keys (a,b,c) z obiektu

console.log(Object.keys(obj))kopiuj

czytanie values (1,2,3) z obiektu

console.log(Object.values(obj))kopiuj

czytanie keys i values

for (let key in obj)
    console.log(key, obj[key])kopiuj


5. edit, update

- podstawowy wygląd tabeli zawiera przyciski DELETE i EDIT w każdym wierszu
- można przejść w tryb edycji danego wiersza, po naciśnięciu przycisku EDIT w każdym wierszu tabeli
- aby obsłużyć więcej przycisków submit na formularzu należy każdemu z nich, a nie formularzowi, przypisać akcję:


formaction="/actionA"kopiuj

i takiegoż get-a obsłużyć na serwerze:

app.get("/actionA")kopiuj

- możliwe jest też wykonanie całości w oparciu o linki a nie butony
- można usunąć jeden dokument z kolekcji, po naciśnięciu przycisku DELETE czyli alert po stronie klienta, w onclick submita


return confirm('czy usunąć?')kopiuj

- usuwanie danych na serwerze, wg wysłanego _id: patrz punkty poprzednie
- można zaktualizować dane w dokumencie po naciśnięciu przycisku UPDATE, jak poniżej:


anyColl.update({ _id: anyId }, { $set: anyObj }, {}, function (err, numUpdated) {
   console.log("zaktualizowano " + numUpdated)
});kopiuj


gdzie:

anyColl to kolekcja w której dokonujemy zmian
anyId to przesłane id dokumentu do usunięcia
anyObj to taki dokument jaki ma być zawarty w bazie po aktualizacji


- powrót do trybu podstawowego (bez edycji) po naciśnięciu przycisku CANCEL, działa tak samo jak czytanie wszystkich danych



6. dokumentacja nedb

https://github.com/louischatriot/nedbkopiuj

7. asynchroiczne wrappery dla nedb

nedb działa na callbackach, co powoduje konieczność zagnieżdżania działań w oczekiwaniu na wynik poprzednich działań
istnieje sporo wrapperów napisanych na bazie nedb, używających składni async / await , można wypróbować

https://github.com/bajankristof/nedb-promises
https://www.npmjs.com/package/nedb-async


Zadanie: wykonaj asynchroniczną wersję projektu, z użyciem jednej z ww bibliotek