ukryj menu
SPEC
aktualizacja: 2021-11-24 13:50:56
Uwaga - projekt będzie oceniony przed końcem semestru
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