Professional Documents
Culture Documents
Računarske Komunikacije I Internet: MongoDB
Računarske Komunikacije I Internet: MongoDB
SEMINARSKI RAD
Predmet: Računarske komunikacije i Intenet
“Upis u MongoDB bazu podataka”
0
Sadržaj
1. Uvod ........................................................................................................................................2
2. Struktura MongoDB baze podataka ..........................................................................................3
2.1 MongoDB baze i kolekcije ..................................................................................................3
2.2 MongoDB dokumenti ..........................................................................................................4
2.2.1 Kreiranje dokumenta ................................................................................................................ 5
2.2.2 Pristup elementima ................................................................................................................... 5
2.2.3 Nazivi polja .............................................................................................................................. 6
3. Čitanje, ažuriranje i brisanje u MongoDB..............................................................................7
3.1 Prikaz sadržaja. Upiti ..........................................................................................................7
3.2 Ograničavanje i sortiranje prikaza .......................................................................................8
3.3 Ažuriranje ...........................................................................................................................8
3.4 Pogledi ................................................................................................................................9
3.5 Reference .......................................................................................................................... 10
3.6 Brisanje MongoDB dokumenata, kolekcije i baze podataka ............................................... 10
4. Indeksiranje ............................................................................................................................ 10
5. Agregacija podataka ............................................................................................................... 11
5.1 Agregacioni upiti............................................................................................................... 12
6. Prosleđivanje funkcija serveru ................................................................................................ 12
7. Replicirajući setovi ................................................................................................................. 13
8. MongoDB i Java ..................................................................................................................... 13
9. GridFS ....................................................................................................................................15
10. Deljenje (Sharding) ............................................................................................................... 15
Zaključak ...................................................................................................................................17
Literatura....................................................................................................................................18
Web stranice ........................................................................................................................... 18
Izvori preuzetih ilustracija .......................................................................................................18
1
1. Uvod
MongoDB je baza podataka otvorenog koda, pisana u programskom jeziku C++, koja pripada
takozvanom “NoSQL svetu”, odnosno ona predstavlja jednu od nerelacionih baza podataka.
Postoji nekoliko vrsta nerelacionih baza, a MongoDB sistemi za upravljanje bazama pripadaju
grupi dokument baza podataka (document database), što znači da se svi podaci čuvaju u obliku
dokumenata, čija je forma srodna formatu JSON (JavaScript Object Notation) dokumenata, iako
se zapravo svi podaci smeštaju u binarnom obliku, tj. BSON (Binary JSON). Dokument se može
posmatrati kao red u tabeli relacione baze, ali bez sheme, pri čemu date vrednosti mogu biti
ugnježdene u proizvoljnoj meri.
Jedan MongoDB server sadrži više baza podataka. Svaka baza podataka je zapravo fizički
direktorijum kolekcija, i svaka od njih ima svoj set datoteka u sistemu. Kolekcija je grupa sličnih
ili ovezanih MongoDB dokumenata i ekvivalentna je tabeli u relacionoj bazi podataka (RDBMS).
Ona postoji u jednoj bazi i ne koristi sheme, a dokumenti u njenom sastavu mogu imati različita
polja. Dokument je set parova u obliku ključ-vrednost. Dokumenti imaju dinamičku shemu, što
znači da dokumenti jedne kolekcije ne moraju imati isti set polja ili strukturu, a zajednička polja
dokumenata u datoj kolekciji mogu sadržati različite tipove podataka.
Online platforma Mongo shell omogućava korisniku da isproba servis bez instalacije MongoDB.
Takođe, MongoDB ima zvanične drajvere za različite programske jezike i razvojna okruženja.
MongoDB predstavlja sredinu između mogućnosti upita relacionih baza i distribuirane prirode
servisa za čuvanje podataka.
2
2. Struktura MongoDB baze podataka
Nakon izvršavanja navedene komande, korisnik se nalazi u kreiranoj bazi. Ostale baze se mogu
prikazati upotrebom komande show dbs, a prebacivanje u bilo koju drugu bazu se može izvršiti
komandom use.
use imeBaze
Listing 2. – Prelaženje u drugu bazu
Ukoliko baza ne postoji, a korisnik pokuša da sačuva neki dokument, MongoDB će automatski
kreirati bazu podataka za dati dokument. Na primer, operacija insertOne() će kreirati i novu bazu
i kolekciju ukoliko one nisu postojale:
use newDB
db.newCollection1.insertOne( { x: 1 } )
Podrazumevana baza podataka je “test” baza, i u nju će biti smeštene kolekcije i dokumenti za
koje nije prethodno kreirana baza.
db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
> db.imeKolekcije.insert({
polje1: „vrednost1“
polje2: „vrednost2“
polje3: „vrednost3“
})
Listing 5. – Opšti oblik dokumenta
Vrednost polja može biti podatak bilo kog BSON tipa, uključujući i druge dokumente, nizove ili
nizove dokumenata.
var mydoc = {
Lis
_id: ObjectId(“5099803df3f4948bd2f98391”),
name: { first: “Alan”, last: “Turing” }
birth: new Date (‘Jun 23, 1912’),
death: new Date (‘Jun 07, 1954’),
contribs: [“Turing machine”, “Turing test”, “Turingery” ],
views: NumberLong(1250000)
}
Svaki dokument ima svoj _id, odnosno ObjectId, koji ih jedinstveno određuje. Svaki ObjectId je
dug 12 bajtova i sastavljen je od vremenskog žiga (timestamp), id-a klijentskog uređaja, id-a
klijentskog procesa i 3-bajtnog inkrementalnog brojača.
4
2.2.1 Kreiranje dokumenta
MongoDB dokument se može kreirati upotrebom metode insert() ili save(). Opšta sintaksa za
metod insert():
>db.CollectionName.insert(document)
Ukoliko u datom trenutku u bazi podataka ne postoji kolekcija sa navedenm imenom, MongoDB
će sam kreirati tu kolekciju i u nju ubaciti ispisani dokument. Takođe, ako se ne odredi _id
parametar u dokumentu koji korisnik želi da doda u kolekciju, MongoDB će dokumentu sam
dodeliti jedinstveni ObjectId.
Za dodavanje više dokumenata upotrebom jednom upita, u insert() komandi se može proslediti
niz dokumenata.
>db.Coll.insert([
{
naziv: ‘dokument1’ ,
autor: ‘korisnik1’ ,
},
{
naziv: ‘dokument3’ ,
autor: ‘korisnik1’ ,
oznake: [‘MongoDB’ , ‘baza podataka’ ] ,
}
])
Za pristup elementima niza ili poljima ugrađenih dokumenata, MongoDB koristi . (dot notation).
Tačna definicija elementa niza kom korisnik želi pristupiti se vrši konkantenacijom, sa tačkom,
imena niza i indeksa datog elementa, dok se polje ugrađenog dokumenta kom je potrebno
pristupiti označava konkantenacijom naziva dokumena i željenog polja.
<array>.<index>
“<embedded document>.<field>”
5
Maksimalna veličina BSON dokumenta je 16MB. Ograničenje veličine dokumenta osigurava da
jedan dokument ne opterećuje preveliku količinu RAM memorije. Za skladištenje dokumenata
čija velična prevazilazi navedeni limit, MongoDB koristi GridFS API.
_id polje je rezervisano za primarni ključ, njegova vrednost mora biti jedinstvena u
kolekciji, ne može se menjati i može biti bilo kog tipa osim niza (array).
naziv polja ne može sadržati karakter null
polja najvišeg nivoa ne mogu započinjati znakom $
BSON dokumenti mogu sadržati polja sa istim nazivima, međutim većina MongoDB interfejsa
predstavlja bazu strukturom (hash table) koja ne podržava duplikate. Neki dokumenti kreirani
unutar internih MongoDB procesa mogu imati duplikate, ali nijedan MongoDB proces nikada
neće dodati polje koje je dupllikat u dokument koji je kreirao korisnik.
Po pravilu, MongoDB kreira jedinstveni indeks za polje _id tokom kreiranja kolekcije. Polje _id
je uvek prvo u dokumentu; ukoliko server primi dokument u kom ono nije na prvom mestu, on će
ga automatski premestiti na početnu poziciju. Vrednost _id polja može biti podatak bilo kog
BSON tipa, osim niza (array).
6
3. Čitanje, ažuriranje i brisanje u MongoDB
Korišćenjem metode find() moguće je kreirati i upite koji filtriraju vrednosti podataka u
dokumentu, kao i upite sa više kriterijuma. U sledećem primeru upit će izdvojiti sve dokumente
čiji naziv počinje slovom “D” i koji ima broj pregleda od 10 do 100, a narediće se da se prikaže
samo naziv dokumenata koji zadovoljavaju uslove.
var opseg_pregleda = {}
opseg_pregleda[ ‘$lt’ ] = 100
opseg_pregleda[ ‘$gt’ ] = 10
>db.CollectionName.find(
{ naziv : / ^D/ , pregledi : opsegPregleda },
{ naziv : 1 }
)
Srodna metoda metodi find() jeste findOne(), koja će pronaći i prikazati tačno jedan specifirani
dokument. A za fomatirani prikaz podataka koristi se metoda pretty().
>db.CollectionName.find().pretty()
Moguće je pokretanje i korisnički definisane funkcije koja će se izvršti nad svim dokumentima
određene kolekcije. Osnovni nedostaci ovog postupka se ogledaju u tome što nije moguća
upotreba indeksa, kao i činjenica da Mongo ne može da optimizuje ovakve upite.
>db.CollectionName.find( function() {
return this.pregledi > 100 && this.pregledi < 500 ;
})
Da bi se ograničio broj dokumenata koji će se prikazati, MongoDB koristi metod limit(), koji
prihvata jedan argument u vidu broja, koji predstavlja količinu dokumenata koji će se prikazati.
Ukoliko se ne specifira argument metode, prikazaće se svi dokumenti koji se skladište u datoj
kolekciji.
>db.CollectionName.find().limit(broj)
Sortiranje dokumenata se vrši metodom sort(). Naredba prihvata dokument sa listom polja, iza
čega sledi njihov red sortiranja. Da bi se dokument sortirao, koriste se vrednosti 1 i -1, gde 1
predstavlja slučaj gde će se polja sortirati uzlazno, a -1 se koristi da bi se dobio silazni redosled.
>db.CollectionName.find().sort({key : 1})
Ukoliko se posebno ne navede način sortiranja, podaci će se, po pravilu, ređati po uzlaznom
poretku.
3.3 Ažuriranje
Ažuriranje podataka u dokumentu se može vršiti upotrebom metoda update() i save(). Osnovna
razlika između navedenih metoda se ogleda u rezultatu metode. Metod save() vrši zamenu
postojećeg dokumenta, sa odgovarajućim _id poljem, sa dokumentom koji je prosleđen kao drugi
parametar metode.
>db.CollectionName.save({_id:ObejctId(), novi_podaci})
MongoDB metod update() ažurira, odnosno menja vrednosti u postojećem dokumentu. Metoda
prima dva argumenta, gde prvi argument predstavlja kriterijum uptira, a drugi je objekat čija će
polja biti zamenjena u dokumentima koji zadovoljavaju prethodno navedeni kriterijum. Po
pravilu, naredba će menjati vrednosti željenih polja u jednom dokumetu, međutim dodavanjem
ključne reči multi, moguće je izvesti ažuriranje u većem broju dokumenata.
>db.CollectionName.update(kriterijum : vrednost_koja_se_dodaje)
Listing 17. – Sintaksa naredbe update()
3.4 Pogledi
Svaki pogled sadrži agregacioni vod naspram izvornog koda. MongoDB će proizvesti sadržaj
pogleda izvršavanjem agragacije tokom operacija čitanja podataka.
Pogledi su pružaju isključivo mogućnost čitanj podataka, što znači da će se za operacije pisanja
vratiti poruka o grešci. Tako da pogled podržava samo sledeće operacije:
db.collection.find()
db.collection.findOne()
db.collection.aggregate()
db.collection.countDocuments()
db.collection.estimatedDocumentCount()
db.collection.count()
db.collection.distinct()
U slučaju kreiranja pogleda iz nekog drugog pogleda, ne može se navesti poređenje koje se
razlikuje od poređenja koje se koristi u originalnom, roditeljskom pogledu, a ako se izvodi
agregacija nad više pogleda, na primer upotrebom $lookup ili $graphLookup, upotrebljeni
pogledi moraju imati isto poređenje.
Nije moguća promena naziva već kreiranog pogleda. Za brisanje pogleda, koristi se naredba
db.collection.drop(), koja se može upotrebiti i za modifikovanje pogleda, tako što će se nakon
uklanjanja pogleda, on ponovo kreirati. Modifikacija pogleda je takođe moguće upotrebom komande
collMod.
9
3.5 Reference
Obzirom na distribuiranu prirou MongoDB, nije moguće izvršavanje pridruživanja (Join), ali
moguće je referenciranje dokumenata između sebe i to upotrebom sledeće sintakse:
{ $ref : „CollectionName“, $id : „reference_id“ }
>use databaseName
>db.dropDatabase()
>
Za brisanje kolekcije se takođe koristi metoda drop(). Ukoliko je brisanje kolekcije uspešno
izvršeno, metod će vratiti true, u suprotnom vratiće se false.
>db.CollectionName.drop()
true
>
Brisanje dokumenata se izvodi naredbom remove(), koja može prihvatiti dva parametra. Prvi
parametar je kriterijum za brisanje, a drugi (opciona upotreba) je zastavica (flag) justOne, koja
osigurava da se briše samo jedan dokument, ukoliko više njih zadovoljava navedeni kriterijum.
>db.CollectionName.remove(kriterijum)
>db.CollectionName.remove(kriterijum, 1) // primer sa zastavicom justOne
Kada se u metodi remove() ne navede nikakav kriterijum, obrisaće se svi dokumenti iz date
kolekcije. Takođe, prepoučuje se pokretanje metode find() paralelno sa metodom remove().
4. Indeksiranje
Radi poboljšavanja performansi izvršavanja upita, MongoDB ima ugrađenu podršku za indekse, i
to 3 vrste stuktura za indeksiranje:
B – stabla,
dvodimenzionalni geografski indeksi,
sferični geografski indeksi
>db.CollectionName.ensureIndex({key : 1})
Gde je ključ (key) naziv polja koje je potrebno indeksirati, a 1 označava da će redosled polja biti
ulazan, dok bi u slučaju -1, redosled bio silazan. Metoda ensureIndex() podržava opcije, čija
podešavanja nisu mandatorna. Neke od tih opcija jesu: background, unique, name, sparse,
dropDups, itd.
Pri svakom kreiranju nove kolekcije, MongoDB kreira indeks nad njenim poljem _id, dok se
indeks za određenu kolekciju može prikazati komandom getIndexes().
5. Agregacija podataka
Operacije agregiranja procesuiraju podatke i vraćaju rezultat dobijen vršenjem različitih operacija
nad njima. Agregacija podrazumeva grupiše vrednosti iz više različitih dokumenata, zatim nad
tom grupom podataka vrši određene operacije i vraća jednu vrednost, odnosno rezultat.
>db.CollectionName.aggregate(AgregacionaOperacija)
Listing 23. – Sintaksa metode aggregate()
1) count() - serverska komanda koja će prebrojati sve objekte koji zadovoljavaju postavljeni
kriterijum upita
2) distinct() – funkcija koja, slično kao kod standardnog SQL-a, vraća svaku podudarajuću
vrednost, koja se javlja jednom ili više puta. Odnosno, vrednosti koje se ponavljaju,
prikazaće samo jednom
3) group() – najkompleksniji pojedinačni Mongo upit, koji grupiše objekte koji ispunjavaju
određeni uslov, i to prema određenom kriterijumu:
>db.CollectionName.group({
initial: {count : 0},
reduce: function(param1, param2) { output.count++; },
cond: {“uslov”},
key: {nazivPolja : true}
})
U prethodnom primeru key predstavlja polje po kom treba izvršiti grupisanje, cond je uslov kojim
određujemo koje vrednosti se posmatraju, a reduce je funkcija koja određuje kako će izlaz
zavisiti od vrednosti.
Bilo koja JavaScript funkcija se može sačuvati na serveru (slično stornoj proceduri u SQL-u) i to
u specijalnoj kolekciji system.js. Funkcija se čuva tako što će polje _id sadržati naziv funkcije,
dok će polje value sadržati njeno telo.
> db.system.js.save({
_id:'getLast',
value:function(collection){
return collection.find({}).sort({'_id':1}).limit(1)[0]
}
})
Listing 25. – Primer čuvanja JS funkcije
12
7. Replicirajući setovi
Mongo je zamišljen da radi na više radnih jedinica (mašina), omogući konzistentnost podataka i
bude prilagodljiv na podele. Međutim, ako je jedan deo kolekcije izgubljen svi podaci padaju u
vodu, da bi rešio taj problem, Mongo primenjuje dupliranje. Repliciranje podataka implicira dosta
problema, a jedan od njih jeste izbor novog glavnog servera kada glavni server
padne. Mongo rešava ovaj problem tako što svakom serveru pruža priliku, a server koji ima
najsvežije podatke biva proglašen za novi glavni server.
Replicirajući set je grupa mongod instanci. U replici postoji jedan primarni čvor koji prima sve
operacije upisivanja, a sve druge instance primenjuju operacije iz tog čvora , tako da sve imaju
jednaki set podataka. Po pravilu, jedan replicirajući set bi trebao imati barem 3 čvora, od koji je
samo jedan primarni.
8. MongoDB i Java
Da bi MongoDB mogao da se koristi u Javi, radna jedinica mora imati instaliran JDBC drajver i
Java se up. Za povezivanje sa bazom potrebno je tačno navesti ime baze, a ukoliko ona ne postoji,
MongoDB će je automatski generisati.
import com.mongodb.client.MongoDatabase;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
// Creating Credentials
MongoCredential credential;
credential = MongoCredential.createCredential("sampleUser", "myDb",
"password".toCharArray());
System.out.println("Connected to the database successfully");
Dodavanje dokumenta u bazu podataka se vrši metodom insert(), selektovanje svih dokumenata
metodom find(), njihovo ažuriranje metodom updateOne(), a brisanje metodom deleteOne() i
to sve iz klase com.mongodb.client.MongoCollection.
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
// Creating Credentials
MongoCredential credential;
credential = MongoCredential.createCredential("sampleUser", "myDb",
"password".toCharArray());
System.out.println("Connected to the database successfully");
// Creating a collection
14
System.out.println("Collections created successfully");
// Retieving a collection
MongoCollection<Document> collection = database.getCollection("sampleCollection");
// Dropping a Collection
collection.drop();
System.out.println("Collection dropped successfully");
}
}
Listing 27. – Kod u Javi sa metodama za dodavanje, ažuriranje i brisanje kolekcija
9. GridFS
U MongoDB GridFS se koristi za skladištenje velikih dokumenata (obično veći od 16MB), kao
što su slike, zvučni zapisi, video zapisi, itd. Može se posmatrati kao sistem datoteka, osim što su
svi dokumenti smešteni u MongoDB kolekcijama. U osnovi, GridFS deli dati podatak na delove i
raspoređuje ih i čuva u zasebnim dokumentima, čija je tipična veličina do 255KB.
GrdFS po pravilu koristi dve kolekcije, fs.files (koji ima ulogu roditeljskog dokumenta) i
fs.chunks, gde čuva metapodatke objekta i njegove delove. Svaki deo ima svoj jedinstveni _id,
koji se čuva u ObjectId polju.
Sharding je postupak deljenja podataka, odnosno njihovih čuvanja na različitim uređajima, koji je
osmišljen za prevazilaženje problematike rasta baze podataka, jer pri gomilanju podataka i širenju
baze, može se desiti da jedan računar nema dovoljno prostora za čuvanje date količine
dokumenata i prestaje da pruža efikasne funkcije čitanja i upisivanja u bazu. Proces rešava
horizontalnu skalabilnost dodavanjem više radnih jedinica kako bi se podržali svi podaci i
omogućilo efikasno manipulisanje bazom podataka.
16
Zaključak
MongoDB je baza podataka za opštu upotrebu. Postoji mnogo projekata koji danas
koriste MongoDB. Njena dinamička šema i objektno-orijentisana struktura, čine je pravim
izborom za analitiku u realnom vremenu, kao i za e-komerc, mobilne aplikacije, arhiviranje i
slično. Poznati slučajevi korišćenja MongoDB obuhvataju “big data” podatke, upravljanje
sadržajem, mobilnu i društvenu infrastrukturu i mnoge druge. Takodje, pojavljuju se izazovi za
korišćenje MongoDB za Business Intelligence modele.
Sve do novembra 2012. godine, MongoDB standardni model vraćao je podatke koji su bili
upisani tek pošto je unet tekući red čekanja od strane klijenta, što je značilo da osnovno
podešavanje nije bilo dovoljno stabilno u slučaju pucanja na strani klijenta. Promena standardnog
modela u sigurniji, izazvala je brojne zastoje u performansama, a i dalje ostaju brige da li sigurniji
modeli i dalje čine podatke ranjivim u slučaju otkazivanja pojedinačne mašine, iako se većina
ovih briga odnosi na starije verzije MongoDB (2.0 i 2.2).
MongoDB koristi "zaključavanje" čitaoci-pisac koja omogućava konkurentan pristup bazi
podataka za čitanje, ali pisanje je omogućeno samo za jednu operaciju. Postoje i kritike koje se
odnose na ograničenja MongoDB kada se koristi na 32-bitnim sistemima, što je u nekim
slučajevima posledica nasleđenih memorijskih ograničenja. MongoDB preporučuje 64-bitne
sisteme i zahteva od korisnika da obezbede dovoljno RAM memorije za rad.
Takođe, MongoDB obezbeđuje veoma ograničenu podršku za sortiranje UTF-8 enkodirane string
podatke, što stvara ozbiljan problem prilikom smeštanja ne-engleskog teksta.
17
Literatura
Web stranice
https://www.tutorialspoint.com/mongodb/index.htm
https://docs.mongodb.com/manual/
https://imi.pmf.kg.ac.rs/imi-blog/mongodb-i-deo/
Slika 2. https://www.tutorialspoint.com/mongodb/index.htm
Slika 3. https://www.tutorialspoint.com/mongodb/index.htm
Slika 4. https://www.tutorialspoint.com/mongodb/index.htm
18