MongoDB - Document (Dokument)
Zadatak 8 - Uneti navedeni dokument u kolekciju student unutar baze podataka studenti
Dokument
{
"_id":"2012/0112",
"ime":"Emilie Eric",
"smer":"ISiT",
"grad":"Cacak",
}
Da bi se unela data unutar MongoDB kolekcije, moguće je korisiti dve MongoDB komande insert()
i save()
.
Sintaksa je db.COLLECTION_NAME.inser(document)
.
Rešenje 1- Koristeći insert()
> use studenti
switched to db studenti
> db.student.insert({
"_id":"2012/0112",
"ime":"Emilie Eric",
"smer":"ISiT",
"grad":"Cacak",
})
WriteResult({ "nInserted" : 1 })
Dodatak
Ovde je naziv kolekcije _student. _Ukoliko kolekcija pre ovog trenutka nije napravljena, ili je napravljena pa obrisana, MongoDB će je automatski napraviti i smestiti dokument u nju.
Ukoliko unutar dokumenta nije definisan _id
parametar MongoDB će dodeliti jedinstven ObjectId dokumentu.
_id
je 12bit heksadecimalni broj jedinstven za svaki dokument u kolekciji. 12 bita se dele na ledeći način:
- 4 bita timestamp
- 3 bita ID kompjutera
- 2 bita ID procesa
- 3 bita "incrementer"
Rešenje 2 - Koristeći save()
> use studenti
switched to db studenti
> db.student.save({
"_id":"2012/0112",
"ime":"Emilie Eric",
"smer":"ISiT",
"grad":"Cacak",
})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "2012/0112" })
Dadatak
Ukoliko se _id
ne specificira onda save() metod radi isto kao insert(). Međutim ukoliko se _id
specificirasave()
će zameniti svu data-u unutar dokumenta čiji je id unutar save()
metode.
Zadatak 9 - Uneti navedenu listu dokumenata jednim "query-jem" u kolekciju student unutar baze podataka studenti
Lista dokumenata
{
"_id":"2012/0161",
"ime":"Daniel Kostic",
"smer":"ISiT",
"grad":"Brzece",
},
{
"_id":"2011/0010",
"ime":"Milos Nikolic",
"smer":"ISiT",
"grad":"Beograd"
}
Rešenje
> use studenti
switched to db studenti
> db.student.insert([
{
"_id":"2012/0161",
"ime":"Daniel Kostic",
"smer":"ISiT",
"grad":"Brzece",
},
{
"_id":"2011/0010",
"ime":"Milos Nikolic",
"smer":"ISiT",
"grad":"Beograd"
}
])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
Zadatak 10 - Prikazati sve dokumente iz kolekcije student koja se nalazi unutar baze podataka studenti
Kako bi prikazali sve dokumente iz kolekcije potrebno je da "pretrazimo" (query) kolekciju bez ikakvih parametara. To ćemo postićo koristeći find()
metodu.
Sintaksa je db.COLLECTION_NAME.find()
. Ovaj metod vraća nestruktuiran dokument što ga u konzoli čini teško čitljivim, tako da je dobro uz query metode koristiti pretty()
metodu koja formatira rezultat.
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Brzece"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
Zadatak 11 - Prikazati prvi dokument iz kolekcije student koja se nalazi unutar baze podataka studenti
Za ovaj slučaj se koristi MongoDB komanda findOne()
, ona vraća samo jedan dokument.
Resenje
> use studenti
switched to db studenti
> db.student.findOne()
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
Zadatak 12 - Prikazati gradove odakle studenti iz kolekcije student dolaze
MongoDB metoda find()
prima drugi opcioni parametar koji predstavlja listu polja koja se mogu "dohvatiti". Kada se pozove samo find()
videli smo da se vraćaju sva polja, tako da ako želimo to da limitiramo potrebno je da postavimo vrednosti za polja 1 ili 0. 1 za prikazati polje, 0 za sakriti. Sintaksa je db.COLLECTION-NAME.find({}, {KEY: 1})
> use studenti
switched to db studenti
> db.student.find({}, {"grad":1, "_id":0})
{ "grad" : "Cacak" }
{ "grad" : "Brzece" }
{ "grad" : "Beograd" }
Dodatak
_id se mora eksplicitno isključiti.
Zadatak 13 - Prikazati imena dva studenta iz kolekcije student
Da bi stavili limit na broj vraćenih odgovora može se koristi MongoDB metoda limit()
. Sintaksa je jednostavnadb.COLLECTION-NAME.find().limit(NUMBER)
.
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Brzece"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
> db.student.find({}, {"ime":1,"_id":0}).limit(2)
{ "ime" : "Emilie Eric" }
{ "ime" : "Daniel Kostic" }
Zadatak 14 - Prikazati ime trećeg studenta iz kolekcije student
Ovo se može odraditi korišćenjem metode skip()
, koja prihvata broj dokumenata koji treba biti preskočen kao argument.
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Brzece"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
> db.student.find({}, {"ime":1,"_id":0}).limit(1).skip(2)
{ "ime" : "Milos Nikolic" }
Zadatak 15 - Sortirati imena studenata iz kolekcije student u opadajućem (descending) redosledu
Za sortiranje dokumenata unutar MongoDB koriste se sort()
metoda. Metod prihvata dokument unutar koga je lista polja zajedno sa njihovim redosledom za sortiranje. 1 se koristi za rastići (ascending) redosled, a -1 za opdajući (descending) redosled. Sintaksa je db.COLLECTION-NAME.find().sort({KEY:1})
Ukoliko se ne specificira redosled sortiranja sort()
će prikazati dokumente u rastućem redosledu.
Rešenje
> use studenti
switched to db studenti
> db.student.find({},{"ime":1,"_id":0}).sort({"ime":-1})
{ "ime" : "Milos Nikolic" }
{ "ime" : "Emilie Eric" }
{ "ime" : "Daniel Kostic" }
Zadatak 16 - Zameniti (update) mesto rođenja (grad) studenta sa imenom "Daniel Kostic" da bude "Beograd"
Za ažuriranje dokumenta koristi se MongoDB metoda update()
.
Sintaksa je sledeća db.COLLECTION-NAME.update(SELLECTION-CRITERIA, UPDATED-DATA)
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Brzece"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
> db.student.update({"ime": "Daniel Kostic"},{$set:{"grad":"Beograd"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find().pretty()
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Beograd"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
Zadatak 17 - Ažurirati vrednost smera na "Menadzment" svih studenata čije je mesto rođenja (grad) "Beograd"
Update metoda ažurira jedan dokument, da bi se odradilo ažuriranje više dokumenata potrebno je podesiti parametar multi
na true
.
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"grad" : "Beograd"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
> db.student.update({"grad":"Beograd"},{$set:{"smer":"Menadzment"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.student.find().pretty()
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
Zadatak 18 - Ažurirati studenta sa brojem indeksa "2012/0161", ime je "Milos Milojkovic" i dolazi iz grada "Jagodina". Ostale informacije nisu potrebne
Za ovakve zahteve može se koristiti metoda save()
. Ona zamenjuje ceo dokument sa novim dokumentom koji je prosleđen unutar save()
metode.
Sintaksa za MongoDB save()
metodu je db.COLLECTION-NAME.save({_id:ObjectId(), NEW-DATA})
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
> db.student.save({
"_id" : "2012/0161",
"ime" : "Milos Milojkovic",
"grad" : "Jagodina"
})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find().pretty()
{ "_id" : "2012/0161", "ime" : "Milos Milojkovic", "grad" : "Jagodina" }
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
Zadatak 19 - Obrisati prvog studenta iz kolekcije student ciji grad ima vrednost "Jagodina"
Za brisanje dokumenata iz kolekcija koristi se MongoDB metoda remove()
. On prima dva parametra
- deletion criteria - (Opciono) kriterijum koji dokument mora da ispuni da bi bio obrisan
db.COLLECTION-NAME.remove(DELETION-CRITERIA)
- justOne - (Opciono) ukoliko je podešeno na
true
ili 1, obrisaće se samo jedan dokument (ako ih ima vise)db.COLLECTION-NAME.remove(DELETION-CRITERIA, 1)
Ukoliko se ne definiše nikakav kriterijum već se pozove samo db.COLLECTION-NAME.remove({})
brišu se svi dokumenti iz kolekcije.
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{ "_id" : "2012/0161", "ime" : "Milos Milojkovic", "grad" : "Jagodina" }
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
> db.student.remove({"grad": "Jagodina"}, 1)
WriteResult({ "nRemoved" : 1 })
> db.student.find().pretty()
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
Zadatak 20 - Obrisati sve studente is kolekcije student
Rešenje
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "Menadzment",
"grad" : "Beograd"
}
{
"_id" : "2012/0112",
"ime" : "Emilie Eric",
"smer" : "ISiT",
"grad" : "Cacak"
}
> db.student.remove({})
WriteResult({ "nRemoved" : 2 })
> db.student.find().pretty()
>
Zadatak 21 - Ubaciti fajl studenti.json unutar kolekcije student koja se nalazi unutar baze podataka studenti
Da bi ubacili json fajl unutar neke kolekcije koristi se komanda mongoimport
i to sa sledećom sintaksom (ovo se radi van mongo shell-a)
mongoimport --db DATABASE-NAME --collection COLLECTION-NAME --file PATH-AND-FILENAME
Treba uzeti u obzir strukturu json fajla, ako su dokumenta struktuirana unutar array-ja (kao što je u našem slučaju), potrebno je dodati i --jsonArray
.
JSON fajl možete preuzeti ovde : https://github.com/elab-office/mongoDB/blob/master/json/studenti.json
Rešenje
mongoimport --db studenti --drop --collection student --file (zamenite sa vašim path-om do fajla)~/desktop/studenti.json --jsonArray
2017-04-27T16:33:18.010+0200 connected to: localhost
2017-04-27T16:33:18.010+0200 dropping: studenti.student
2017-04-27T16:33:18.074+0200 imported 10 documents
I sada kada pokrenete mongo
> use studenti
switched to db studenti
> db.student.find().pretty()
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd2e"),
"student_id" : "2012/0161",
"ime" : "Daniel Kostic",
"smer" : "ISiT",
"polozeni_ispiti" : [
{
"predmet" : "AROS",
"ocena" : "6",
"datumPolaganja" : "4.3.2013",
"semestar" : "III"
},
{
"predmet" : "Strukture podataka i algoritmi",
"ocena" : "9",
"datumPolaganja" : "13.4.2014",
"semestar" : "IV"
},
{
"predmet" : "PIS",
"ocena" : "10",
"datumPolaganja" : "10.1.2016",
"semestar" : "VII"
},
{
"predmet" : "Upravljanje kvalitetom",
"ocena" : "8",
"datumPolaganja" : "16.9.2016",
"semestar" : "VIII"
}
],
"grad" : "Brzece",
"Postanski_broj" : "54000",
"srednja_skola" : {
"grad" : "Brus",
"tip" : "Gimnazija",
"naziv" : "Gimnazija u Brusu",
"poeni_iz_skole" : "37.5"
}
}
...