IEP/K1 Jun 2022

Izvor: SI Wiki
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)
  1. 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.
  2. 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.
  3. 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
});

Testiranje