MongoDB - Queries (Upiti)
Upiti nad dokumentima se izvršavaju pomoću osnovnih uslova (conditions). Neki od uslova su navedeni u sledećoj tabeli. Uslovi se unose kao prvi parametar unutar find()
metode. Sintaksa je sledeća db.COLLECTION-NAME.find({QUERY})
Operacija | Sintaksa |
---|---|
Jednako (Equality) | { <key> : <value> } |
Manje (Less Than) | { <key> : { $lt: <value> } } |
Manje Jednako (Less Than Equals) | { <key> : { $lte: <value> } } |
Veće (Greater Than) | { <key> : { $gt: <value> } } |
Veće Jednako ( Greater Than Equals) | { <key> : { $gte: <value> } } |
Različito (Not Equals) | { <key> : { $ne : <value> } } |
Zadatak 22 - Prikazati sve studente iz kolekcije student koji studiraju na smeru "Menadzment"
Resenje
> use studenti
switched to db studenti
> db.student.find({"smer":"Menadzment"}).pretty()
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd32"),
"student_id" : "2012/0187",
"ime" : "Petar Jelenkovic",
"smer" : "Menadzment",
"polozeni_ispiti" : [
{
"predmet" : "AROS",
"ocena" : "10",
"datumPolaganja" : "4.3.2013",
"semestar" : "III"
},
{
"predmet" : "EPOS",
"ocena" : "8",
"datumPolaganja" : "20.3.2015",
"semestar" : "V"
},
{
"predmet" : "PIS",
"ocena" : "7",
"datumPolaganja" : "10.1.2016",
"semestar" : "VII"
},
{
"predmet" : "Internet Marketing",
"ocena" : "10",
"datumPolaganja" : "15.7.2016",
"semestar" : "VIII"
}
],
"grad" : "Beograd",
"Postanski_broj" : "11000",
"srednja_skola" : {
"grad" : "Beograd",
"tip" : "Gimnazija",
"naziv" : "Matematicka Gimnazija",
"poeni_iz_skole" : "36.6"
}
}
....
Zadatak 23 - Prikazati sve studente iz kolekcije student koji studiraju na smeru "ISiT" I nisu iz "Beograd"-a.
Ukoliko postoji više uslova koji treba biti isputnjeni koristi se $and
unutar find()
metode, tako što se kao lista proslede svi uslovi koji moraju biti odvojeni ,
. Sintaksa je sledeća
db.COLLECTION-NAME.find({ $and: [ {CONDITION}, {CONDITION}, .... ] })
Rešenje
> use studenti
switched to db studenti
> db.student.find({ $and: [{"smer":"ISiT"}, {"grad": {$ne: "Beograd"}}] }).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"
}
}
...
Zadatak 24 - Prikazati sve studente iz kolekcije student koji dolaze iz grada "Sarajevo" ILI studiraju na smeru "Menadzment"
Za ovakve slučajeve koristi se $or
unutar find()
metode, tako što se kao lista proslede svi uslovi koji moraju biti odvojeni ,
. Sintaksa je sledeća
db.COLLECTION-NAME.find({ $or: [ {CONDITION}, {CONDITION}, .... ] })
Rešenje
> use studenti
switched to db studenti
> db.student.find({ $or: [{"grad":"Sarajevo"}, {"smer":"Menadzment"}] }).pretty()
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd32"),
"student_id" : "2012/0187",
"ime" : "Petar Jelenkovic",
"smer" : "Menadzment",
"polozeni_ispiti" : [
{
"predmet" : "AROS",
"ocena" : "10",
"datumPolaganja" : "4.3.2013",
"semestar" : "III"
},
{
"predmet" : "EPOS",
"ocena" : "8",
"datumPolaganja" : "20.3.2015",
"semestar" : "V"
},
{
"predmet" : "PIS",
"ocena" : "7",
"datumPolaganja" : "10.1.2016",
"semestar" : "VII"
},
{
"predmet" : "Internet Marketing",
"ocena" : "10",
"datumPolaganja" : "15.7.2016",
"semestar" : "VIII"
}
],
"grad" : "Beograd",
"Postanski_broj" : "11000",
"srednja_skola" : {
"grad" : "Beograd",
"tip" : "Gimnazija",
"naziv" : "Matematicka Gimnazija",
"poeni_iz_skole" : "36.6"
}
}
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd34"),
"student_id" : "2013/0007",
"ime" : "Nikola Music",
"smer" : "ISiT",
"polozeni_ispiti" : [
{
"predmet" : "OIKT",
"ocena" : "10",
"datumPolaganja" : "4.2.2014",
"semestar" : "I"
},
{
"predmet" : "Strukture podataka i algoritmi",
"ocena" : "6",
"datumPolaganja" : "14.7.2014",
"semestar" : "IV"
},
{
"predmet" : "SISJ",
"ocena" : "8",
"datumPolaganja" : "10.9.2016",
"semestar" : "VII"
},
{
"predmet" : "Teorija odlucivanja",
"ocena" : "9",
"datumPolaganja" : "23.11.2016",
"semestar" : "VI"
}
],
"grad" : "Sarajevo",
"Postanski_broj" : "75000",
"srednja_skola" : {
"grad" : "Sarajevo",
"tip" : "Gimnazija",
"naziv" : "Treca gimnazija",
"poeni_iz_skole" : "37.5"
}
}
...
Zadatak 25 - Prikazati sve studente iz kolekcije student koji su položili predmet "AROS".
Kako svaki dokument (koji predstavlja jednog studenta) unutar kolekcije sadrži listu položenih ispita, ovaj zadatak zahteva da se prođe kroz tu listu i ako unutar nje postoji dokument koji predstavlja predmet sa imenom "AROS", taj student treba da se prikaže.
Prolaženje kroz listu dokumenta unutar dokumenta se ostvaruje korišćenjem $elemMatch
operacijom koja vraća dokument čija lista sadrži bar jedan element koji ispunjava bar jedan upit koji se nalaze unutar $elemMatch
. Sintaksa je sledećadb.COLLECTION-NAME.find( FIELD: { $elemMatch: { QUERY, QUERY....} } )
Rešenje
> use studenti
switched to db studenti
> db.student.find({ "polozeni_ispiti" : { $elemMatch: { "predmet": "AROS" }}}).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"
}
}
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd32"),
"student_id" : "2012/0187",
"ime" : "Petar Jelenkovic",
"smer" : "Menadzment",
"polozeni_ispiti" : [
{
"predmet" : "AROS",
"ocena" : "10",
"datumPolaganja" : "4.3.2013",
"semestar" : "III"
},
{
"predmet" : "EPOS",
"ocena" : "8",
"datumPolaganja" : "20.3.2015",
"semestar" : "V"
},
{
"predmet" : "PIS",
"ocena" : "7",
"datumPolaganja" : "10.1.2016",
"semestar" : "VII"
},
{
"predmet" : "Internet Marketing",
"ocena" : "10",
"datumPolaganja" : "15.7.2016",
"semestar" : "VIII"
}
],
"grad" : "Beograd",
"Postanski_broj" : "11000",
"srednja_skola" : {
"grad" : "Beograd",
"tip" : "Gimnazija",
"naziv" : "Matematicka Gimnazija",
"poeni_iz_skole" : "36.6"
}
}
Zadatak 26 - Prikazati studente iz kolekcije studenti koji su iz "Beograda" i studiraju smer "ISiT" ili su položili ispit "Matematika 1".
Za ovakve slučajeve potrebno je korisiti $and
i $or
operacije u kombinaciji.
Rešenje
> use studenti
switched to db studenti
> db.student.find({ $and: [{"grad": "Beograd"}, {$or: [{"smer": "ISiT"}, { "polozeni_ispiti" : { $elemMatch: { "predmet": "Matematika 1"}}} ]} ]}).pretty()
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd30"),
"student_id" : "2011/0010",
"ime" : "Milos Nikolic",
"smer" : "ISiT",
"polozeni_ispiti" : [
{
"predmet" : "EPOS",
"ocena" : "10",
"datumPolaganja" : "25.2.2014",
"semestar" : "V"
},
{
"predmet" : "Programski jezici",
"ocena" : "6",
"datumPolaganja" : "14.2.2015",
"semestar" : "VI"
},
{
"predmet" : "Baze podataka",
"ocena" : "8",
"datumPolaganja" : "5.10.2015",
"semestar" : "VI"
},
{
"predmet" : "ITEH",
"ocena" : "9",
"datumPolaganja" : "22.6.2015",
"semestar" : "VII"
}
],
"grad" : "Beograd",
"Postanski_broj" : "11070",
"srednja_skola" : {
"grad" : "Beograd",
"tip" : "Tehnicka",
"naziv" : "Arhitektonska-tehnicka skola",
"poeni_iz_skole" : "35"
}
}
{
"_id" : ObjectId("5902012ebb26ec62d0b6bd37"),
"student_id" : "2015/0172",
"ime" : "Rastko Cerge",
"smer" : "Menadzment",
"polozeni_ispiti" : [
{
"predmet" : "Matematika 1",
"ocena" : "10",
"datumPolaganja" : "25.2.2017",
"semestar" : "I"
},
{
"predmet" : "Osnovi organizacije",
"ocena" : "7",
"datumPolaganja" : "27.2.2017",
"semestar" : "VI"
},
{
"predmet" : "Marketing",
"ocena" : "8",
"datumPolaganja" : "15.1.2017",
"semestar" : "III"
},
{
"predmet" : "Progrmairanje 2",
"ocena" : "9",
"datumPolaganja" : "22.2.2017",
"semestar" : "III"
}
],
"grad" : "Beograd",
"Postanski_broj" : "11000",
"srednja_skola" : {
"grad" : "Beograd",
"tip" : "Gimnazija",
"naziv" : "Petnaesta gimnazija",
"poeni_iz_skole" : "35"
}
}
Zadatak 27 - Prikazati imena svih studenata iz kolekcije student koji su položili ispit "AROS" sa ocenom "10".
Rešenje
> use studenti
switched to db studenti
> db.student.find({ "polozeni_ispiti" : { $elemMatch : { $and: [{ "predmet": "AROS" }, { "ocena": "10" }] }} }, {"ime": 1, "_id": 0})
{ "ime" : "Petar Jelenkovic" }