IEP/K1 Jun 2022
< ИЕП
Pređi na navigaciju
Pređi na pretragu
Prvi kolokvijum u junskom roku 2022. godine održan je 17. juna. Bila je dozvoljena upotreba materijala sa predavanja.
Postavka
Posmatrani sistem je jedna privatna lekarska ordinacija koja opslužuje pacijente od kojih su neki radnici ordinacije i u kojoj spolja angažovani lekari-specijalisti pružaju usluge. Ordinacija radi tako što pacijenti prethodno zakazuju termine dolaska. Svaki zakazani termin može biti ostvaren ili neostvaren (ako pacijent ne dođe). Prilikom svakog ostvarenog termina pacijenta može imati jedan ili više tretmana prilikom kojih mu se pruža usluga od strane određenog lekara. Po okončanju termina pacijentu se ispostavlja račun sa stavkama od kojih svaka odgovara jednom tretmanu. Račun se plaća u celini odmah ili naknadno.
LEKAR (IDLek, Ime) USLUGA (IDUsl, Naziv, Cena) PACIJENT (IDPac, Naziv, Adresa) RADNIK (IDPac, MatBroj) TERMIN_ZAK (IDTer, Datum, Vreme, IDPac) TERMIN_OST (IDTer, Trajanje) TRETMAN (IDTre, MedPod, IDLek, IDUsl, IDTer) RACUN (IDRac, Datum, IDTer) STAVKA (IDSta, Iznos, IDTre, IDRac) UPLATA (IDUpl, DatumUplate, IDRac)
- Navesti po jedan primer svakog dokumenta ukoliko bi se za potrebe navedene evidencije koristila baza podataka zasnovana na dokumentima (mongoDB), ali tako da model iskoristi sve prednosti nerelacionog modela podataka.
- Sastaviti skript koji koristeći funkciju za agregaciju (aggregation framework) vraća šifre onih pacijenata koji imaju više od 3 računa nakon 2000 godine sa iznosom preko 15 hiljada.
- Sastaviti Map/Reduce posao koji za svaki datum kada je kreiran bar jedan račun vraća informaciju o prosečnom broju stavki na njemu.
1. zadatak
Termin_Zak
{
"_id": 1,
"Datum": "03/29/2023",
"Vreme": "19:48",
// Termin_Ost
"Trajanje": 2
}
Tretman
{
"_id": 1,
"MedPod": "nesto",
// Lekar
"Lekar": {
"Ime": "Marko Markovic"
},
// Usluga
"Usluga": {
"Naziv": "Masaza",
"Cena": 3000
},
"Termin": 1
}
Račun
{
"_id": 1,
"Datum": "2023-03-23T19:48:36Z",
"Termin": 1,
// Pacijent
"Pacijent": {
"IDPac": 1,
"Naziv": "Milos Milosevic",
"Adresa": "Petra Petrovica 22",
// Radnik
"MatBroj": 1029310418124
},
// Stavka
"Stavke": [
{
"IDSta": 1,
"Iznos": 100,
"Tretman": 1
}
],
// Uplata
"Uplata": {
"DatumUplate": "03/29/2023"
}
}
2. zadatak
db.racun.aggregate([
{
$addFields: {
Godina: {
$year: {
$dateFromString: {
dateString: "$Datum"
format: "%Y-%m-%dT%H:%M:%SZ"
}
}
}
}
},
{
$match: {
Godina: {
$gt: 2000
}
}
},
{
$unwind: {
"$Stavke"
}
},
{
$group: {
_id: "$_id",
Iznos: {
$sum: "$Stavke.Iznos"
},
SifraPacijenta: {
$first: "$Pacijent.IDPac"
}
}
},
{
$match: {
Iznos: {
$gt: 15000
}
}
},
{
$group: {
_id: "$SifraPacijenta"
BrojRacuna: {
$count {}
}
}
},
{
$match: {
BrojRacuna: {
$gt: 3
}
}
},
{
$project: {
SifraPacijenta: "$_id",
_id: 0
}
}
]);
3. zadatak
var mapFunction = function() {
var key = this.Datum;
var value = {
count: 1,
sum: this.Stavke.length,
avg: 0
};
emit(key, value);
};
var reduceFunction = function(key, values) {
var reducedVal = {
count: 0,
sum: 0,
avg: 0
};
for (var idx = 0; idx < values.length; idx++) {
reducedVal.count += values[idx].count;
reducedVal.sum += values[idx].sum;
}
return reducedVal;
};
var finalizeFunction = function(key, reducedVal) {
reducedVal.avg = reducedVal.sum / reducedVal.count;
return reducedVal;
};
db.racun.mapReduce(mapFunction, reduceFunction, {
out: "Zadatak_3",
finalize: finalizeFunction
});