You are on page 1of 19

Univerzitet u Novom Sadu

Tehnički fakultet „Mihajlo Pupin“


Zrenjanin

SEMINARSKI RAD
Predmet: Računarske komunikacije i Intenet
“Upis u MongoDB bazu podataka”

Predmetni nastavnik: Autor rada:


prof. dr Dalibor Dobrilović Radmila Vukelja SI 3/17
Asistent: Softversko inženjerstvo
Milica Mazalica

Zrenjanin, 2020. godina

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.

Smeštanje je usmereno na dokumenta, jer JSON dokumenti sa dinamičkom shemom pružaju


mogućnost jednostavnijeg upravljanja i snagu. Pruža automatsku podršku indeksiranju, odnosno
moguće je indeksiranje bilo kog atributa. Omogućava brzo ažuriranje baze, kao i mapiranje, tj.
fleksibilnu agregaciju i obradu podataka. Takođe, MongoDB je skalabilan, što znači da je
horizontalno skaliranje (distribucija logičkog sistema baze podataka između skupa mašina) se
izvršava bez ugrožavanja funkcionalnosti.

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

2.1 MongoDB baze i kolekcije


Baze podataka sadrže kolekcije dokumenata.

Za kreiranje nove baze, u komandnoj liniji se pokreće sledeća komanda:


$ mongo imeBaze
Listing 1. – Kreiranje baze

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 } )

Listing 3. – Automatsko kreiranje nove baze i kolekcije

Podrazumevana baza podataka je “test” baza, i u nju će biti smeštene kolekcije i dokumenti za
koje nije prethodno kreirana baza.

Kolekcije čuvaju dokumente, i analogne su tabelama u relacionim bazama podataka. Ukoliko ne


postoji, upotrebom operacija insertOne(), kao i createIndex(), respektivno će se kreirati njiohove
kolekcije ukoliko prethodno nisu postojale.

db.myNewCollection2.insertOne( { x: 1 } )

db.myNewCollection3.createIndex( { y: 1 } )

Listing 4. – Automatsko kreiranje nove kolekcije

Eksplicitno kreiranje kolekcije se vrši metodom db.createCollection() koja omogućava


manipulaciju različitim karakteristikama date kolekcije (maksimalna veličina, pravila validacije
itd.), za dodatno menjanje opcija date kolekcije, upotrebljava se metod collMod.
Po pravilu, dokumenti jedne kolekcije ne moraju imati istu strukturu, odnosno mogu imati
različita polja, a zajednička polja mogu čuvati različite tipove podataka. Međutim, od verzije
MongoDB 3.2, moguće je podesiti pravila validacije dokumenta za datu kolekciju prilikom
njenog ažuriranja.

Ograničene kolekcije (Capped collections) su kolekcije fiksirane veličine, koje podržavaju


operacije velike propusnosti koje ubacuju i preuzimaju dokumente na osnovu redosleda umetanja.
Kada kolekcija popuni prostor koji joj je dodeljen, ona će osloboditi prostor za nove dokumente
3
prepisivanjem onih koji su u tom trenutku najstariji u datoj kolekciji. Pri pravljenju prostora za
nove dokumente, ograničena/zatvorena kolekcija će automatski ukloniti najstarije dokumente, tj
nema potrebe za skriptama ili eksplicitnim operacijama uklanjanja.

2.2 MongoDB dokumenti

MongoDB dokumenti su sastavljeni od parova polje – vrednost.

> 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)
}

Listing 6. – Primer MongoDB dokumenta

U navedenom primeru, tipovi podataka u poljima su sledeći:

 _id – sadrži ObjectId


 name – sadrži ugrađena (embedded) polja first i last
 birth, death – vrednosti tipa Date
 contribs – sadrži niz stringova
 views – tip NumberLong

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.

Slika 1. – Shema ObjectId

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)

Listing 7. – Opšti primer dodavanja dokumenta u kolekciju

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’ ] ,
}
])

Listing 8. – Unos niza dokumenata jednim upitom

Za dodavanje dokumenta može se koristiti save() metod: >db.Collection.save(document). Ako


se _id parametar ne odredi, metod će se ponašati isto kao i u slučaju upotrebe insert() metode, ali
ako se navede određeni _id, u bazi podataka će se zameniti čitav sadržaj dokumenta koji je imao
datu _id vrednost, sa podacima koji su ispisani u save() metodi.

2.2.2 Pristup elementima

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>”

Listing 9. – Pristup elementu niza

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.

2.2.3 Nazivi polja

Nazivi polja su stringovi, i propisana su određena pravila za imenovanje polja.

 _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.

U skladu sa BSON notacijom, vitičaste zagrade, {…}, označavaju objekat sa ključevima i


vrednostima, a uglaste, […], označavaju niz.

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

3.1 Prikaz sadržaja. Upiti


Za pregled kolekcija koje postoje u bazi podataka koristi se naredba show collections, dok se za
prikaz sadržaja datih kolekcija koristi metod find(). Ukoliko se za metod find() ne navedu nikakvi
parametri, izlistaće se svi podaci, međutim u MongoDB postoji termin projekcija koji
podrazumeva prikaz ne svih podataka, nego samo tačno određenih podataka iz datog dokumenta.
Da bi se to postiglo u listi parametara metoda potrebno je, pored _id, navesti koja još polja je
potrebno ili nije potrebno prikazati, i to uz dodatnu vrednost 1 (true), odnosno 0 (false).

>db.CollectionName.find({}, {key : 1}) // navedeno polje će se prikazati


>db.CollectionName.find({}, {key : 0}) // prikazaće se sva polja, osim navedenog

Listing 10. – Opsta sintaksa find() metode

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 }
)

Listing 11. – Upit koji filtrira podatke

Ugnježdeni nizovi su prilično česti u Mongo-u, i njihovo pretraživanje se može vršiti


jednostavnim zadavanjem tačnih vrednosti, podudaranjem delova vrednosti, a moguće je tražiti i
podudaranje svih vrednosti. Dakle, posebna prednost MongoDB sistema jeste mogućnost
“iskopavanja” duboko sakrivenih poddokumenata.

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()

Listing 12. – Metod 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 ;
})

Listing 13. – Korisnički definisana funkcija


7
3.2 Ograničavanje i sortiranje prikaza

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)

Listing 14. – Metod limit()

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})

Listing 15. – Naredba za uzlazno sortiranje podataka

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})

Listing 16. – Naredba save()

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()

>db.Kolekcija.update({‘naziv’ : ‘MongoDB dokument’},


{$set:{‘naziv’ : ‘Novi dokument’}}, {multi : true})

Listing 18. – Primer ažuriranja naziva više dokumenata

Takođe, moguće je ažurirati vrednosti polja samo određenih dokumenata, i to navođenjem


naredbe find() sa _id oznakama željenih dokumenata, a pre koje se nalazi metod update() u svojoj
8
standardnoj formi. Operator $set se koristi jer je Mongo orijentisan ka dokumentima, tako da u
slučaju izostavljanja navedenog operatora, Mongo će pronađeni dokument zameniti novim, koji je
prosleđen.

3.4 Pogledi

MongoDB omogućava kreiranje pogleda, koji su namenjeni isključivo za čitanje podataka iz


postojećih kolekcija ili drugih pogleda. Na primer, moguće je kreirati pogled koji će spojiti
podatke iz dve povezane kolekcije, pogled koji će isključiti određene podatke iz kolekcije ili
dodati polja sa proračunima dobijenim kombinovanjem nekih polja iz kolekcije.

Svaki pogled sadrži agregacioni vod naspram izvornog koda. MongoDB će proizvesti sadržaj
pogleda izvršavanjem agragacije tokom operacija čitanja podataka.

Definisanje pogleda se može izvršiti na više načina:

 dodavanjem viewOn i pipeline na postojeću naredbu za kreiranje pogleda:

db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline> } )

 navođenjem podrazumevanog poređenja (collation) za pogled:

db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>,


collation: <collation> } )

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“ }

3.6 Brisanje MongoDB dokumenata, kolekcije i baze podataka

Brisanje postojeće baze podataka se izvodi metodom dropDatabase(). U slučaju da se u metodi


ne navede naziv baze, sistem će obrisati default-nu bazu “test”.

>use databaseName
>db.dropDatabase()
>

Listing 19. – Brisanje baze podataka

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
>

Listing 20. – Brisanje kolekcije

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

Listing 21. – Brisanje dokumenta

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

Da ne podržava indekse, MongoDB bi morao ispitivati svaki dokument u kolekciji da bi pronašao


one koji zadovoljavaju navedeni kriterijum upita. Indeksi su specijalne strukture podataka koje
skladište male količine podataka. Oni čuvaju vrednost određenih polja ili setova polja.
10
Kreiranje indeksa se obavlja metodom ensureIndex():

>db.CollectionName.ensureIndex({key : 1})

Listing 22. – Kreiranje indeksa

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.

Agregacija podataka se vrši metodom aggregate():

>db.CollectionName.aggregate(AgregacionaOperacija)
Listing 23. – Sintaksa metode aggregate()

Slika 2. – Tabela agregacionih operacija


11
5.1 Agregacioni upiti

Agregativni upiti omogućavaju programerima rad u bazi koji je kompleksniji od CRUD(Create,


Read, Update, Delete). Neki od osnovnih agregativnih upita jesu:

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}
})

Listing 24. – Upit group()

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.

6. Prosleđivanje funkcija serveru

Da bi se izbeglo pojedinačno povlačenje sa servera i zatim čuvanje posebno za svaki objekat i


tako skratilo vreme izvršavanja i smanjila komunikacija između servera i klijenta, Mongo
omogućava prosleđivanje date funkcije serveru. Jedna od funkcija koja to omogućava jeste eval().

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.

Replikacija je proces sinronizacije podataka na više različitih servera. Ono omogućava


redudantnost podataka i povećava njihovu dostupnost, pravljenjem većeg broja kopija podataka
na više različitih servera, takođe čuva podatke od gubljenja prilikom pada jednog servera, a pruža
i mogućnost oporavka dokumenata pri greškama hardvera ili smetnji na serveru.

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.

Slika 3. – Dijagram MongoDB replikacije

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;

public class ConnectToDB {


13
public static void main( String args[] ) {

// Creating a Mongo client


MongoClient mongo = new MongoClient( "localhost" , 27017 );

// Creating Credentials
MongoCredential credential;
credential = MongoCredential.createCredential("sampleUser", "myDb",
"password".toCharArray());
System.out.println("Connected to the database successfully");

// Accessing the database


MongoDatabase database = mongo.getDatabase("myDb");
System.out.println("Credentials ::"+ credential);
}
Listing 26. –Kod za povezivanje baze podataka

Kreiranje kolekcije izvršava se metodom createCollection(), a biranje, odnosno selektovanje


kolekcije metodom getCollection() iz klase com.mongodb.client.MongoDatabase. Za listanje
svih kolekcija koristi se metoda listCollectionNames() iz iste klase.

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;

public class DropingCollection {

public static void main( String args[] ) {

// Creating a Mongo client


MongoClient mongo = new MongoClient( "localhost" , 27017 );

// Creating Credentials
MongoCredential credential;
credential = MongoCredential.createCredential("sampleUser", "myDb",
"password".toCharArray());
System.out.println("Connected to the database successfully");

// Accessing the database


MongoDatabase database = mongo.getDatabase("myDb");

// 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.

10. Deljenje (Sharding)

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.

Slika 4. – Dijagram sharding-a

Na datom dijagramu se vide 3 osnovne komponente:


15
 Shard – koriste se za skladištenje podataka. Pružaju visoku dostupnost i konzistentnost
podataka, i svaki od njih ima svoj replikacioni set
 Config Servers – čuvaju metapodatke, koji sadrže mapu klastera, a koje ruteri koriste za
određivanje tačnih operacija ka tačno određenim Shard oblastima
 Query Routers – u suštini Mongo instance, odnosno interfejsi ka klijentskim aplikacijama
i vrše direktne operaacije ka odgovarajućim Shard-ovima

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/

Izvori preuzetih ilustracija


Slika 1. 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

You might also like