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

Your email address will not be published.


*