NoSQL – wprowadzenie do nierelacyjnych baz danych na przykładzie MongoDB
NoSQL – wprowadzenie do nierelacyjnych baz danych na przykładzie MongoDB
Termin NoSQL oznacza Not only SQL. Jest to podejście które szczególnie przydatne jest podczas pracy z dużymi zbiorami rozproszonych danych, zapewnia wysoką wydajność, skalowalność oraz elastyczność. Tego typu bazy danych nie są zobligowane do przestrzegania ścisłego ustalonego z góry schematu bazy danych. Zamiast tego stosowane jest podejście prezentacji danych w postaci klucz-wartość np. baza Redis, w postaci magazynu dokumentów np. baza MongoDB, rodziny kolumn np. Casandra czy grafu np. AllegroGraph.
W tradycyjnych bazach danych z góry założony schemat nie zapewnia możliwości gromadzenia danych które nie są przewidziane w zaprojektowanych schemacie. W obecnych czasach ilość gromadzonych danych wzrasta w tempie wykładniczym. Bazy NoSQL pozwalają na dodawanie nieustrukturyzowanych danych bez konieczności modyfikowania schematu bazy jak ma to miejsce w bazach relacyjnych. Daje to ogromne możliwości analizy korelacji pomiędzy różnego rodzaju danymi. Prosty przykład – pewne dane z punktu widzenia biznesowego mogą z początku być nieistotne np. dane dotyczące opadów atmosferycznych nie mają na pierwszy rzut oka związku z tym ile otwieranych jest rachunków bankowych. Później może okazać się, że te dane dostarczą cennych informacji biznesowych. W bazach NoSQL nie trzeba modyfikować sztywnego schematu bazy danych, nie trzeba tworzyć dodatkowych tabel czy modyfikować kodu źródłowego. Analizy biznesowe – BI (z ang. Business Intelligence) będą jednak trudniejsze ponieważ nie bazują na klasycznych zapytaniach SQL.
MongoDB to dokumentowa baza danych napisana w języku C++ wydana pierwszy raz w 2007 roku przechowująca pary identyfikator dokumentu -> dokument. Dokument to podstawowa jednostka danych która przechowywana jest w formacie JSON. Fizycznie jest to zaś BSON. Identyfikator dokumentu to to ciąg znaków o nazwie „_id”. Baza danych MongoDB składa się z kolekcji (odpowiednik tabel z podejścia relacyjnego). Odpowiednikiem kolumn są natomiast pola (z ang. Field). W ramach jednej kolekcji może być wiele dokumentów (rekordów). Występuje tutaj zatem relacja jeden do wielu. Do dzieła!
Zaczynamy od pobrania MongoDB – http://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-linux/:
curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.22.tgz
Rozpakowujemy:
tar -zxvf mongodb-linux-x86_64-3.2.22.tgz
W folderze w którym znajduje się baza danych należy dodatkowo utworzyć katalog:
sudo mkdir -p /data/db/
Uruchomienie bazy danych:
./mongod
Połączenie z bazą danych:
./mongo
Utworzenie bazy danych – baza danych zostanie automatycznie utworzona:
use javaleader
Poniżej wydruk z terminala:
MongoDB shell version: 3.2.22 connecting to: test Server has startup warnings: 2019-07-26T14:10:37.572+0200 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2019-07-26T14:10:37.572+0200 I CONTROL [initandlisten] 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2019-07-26T14:10:37.573+0200 I CONTROL [initandlisten] > use javaleader switched to db javaleader > use javaleader switched to db javaleader
Dodanie przykładowego rekordu:
> db.users.insert({username:"pl.javaleader",password:"12345678"}) WriteResult({ "nInserted" : 1 })
Można użyć również:
db.users.save({username:"pl.javaleader",password:"12345678"})
Różnicy między db.users.save a db.users.insert nie ma. Obydwa polecenia robią dokładnie to samo.
Wypisanie dodanego rekordu – pierwszy dokument w bazie danych MongoDB utworzony:
{ "_id" : ObjectId("5d3aef8440b3f6e88a5c517f"), "username" : "pl.javaleader", "password" : "12345678" }
Wypisanie wszystkich kolekcji (tabel):
show collections
> show collections
users
Aktualizacja dokumentu:
> db.users.update({username:"pl.javaleader"},{$set:{password:"new-password"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) > db.users.find() { "_id" : ObjectId("5d3aef8440b3f6e88a5c517f"), "username" : "pl.javaleader", "password" : "new-password" }
Wyszukanie użytkownika po polu username:
> db.users.find({username:"pl.javaleader"}) { "_id" : ObjectId("5d3aef8440b3f6e88a5c517f"), "username" : "pl.javaleader", "password" : "new-password" }
Wyszukanie użytkownika z użyciem kryteriów:
> db.users.find({$where:"this.username.length<20"}) { "_id" : ObjectId("5d3aef8440b3f6e88a5c517f"), "username" : "pl.javaleader", "password" : "new-password" }
Usunięcie dokumentu po polu username:
> db.users.remove({username:"pl.javaleader"}) WriteResult({ "nRemoved" : 1 })
Wyświetlenie indeksów dla tabel:
> db.users.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "javaleader.users" } ]
Założenie indeksu na kolumnie username:
> db.users.find() > db.users.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "javaleader.users" } ] > db.users.ensureIndex({username:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.users.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "javaleader.users" }, { "v" : 1, "key" : { "username" : 1 }, "name" : "username_1", "ns" : "javaleader.users" } ]
Usunięcie indeksu:
> db.users.dropIndex({username:1}) { "nIndexesWas" : 2, "ok" : 1 }
Tworzenie unikalnego indeksu:
> db.users.ensureIndex({username:1},{unique:true}); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.users.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "javaleader.users" }, { "v" : 1, "unique" : true, "key" : { "username" : 1 }, "name" : "username_1", "ns" : "javaleader.users" } ]
Wyświetlenie pomocy:
db.help()
Wyświetlenie pomocy dla konkretnej kolekcji (tabeli):
db.collection.help()
Leave a comment