ИЕП/К1 Јун 2022

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Први колоквијум у јунском року 2022. године одржан је 17. јуна. Била је дозвољена употреба материјала са предавања.

Поставка

Посматрани систем је једна приватна лекарска ординација која опслужује пацијенте од којих су неки радници ординације и у којој споља ангажовани лекари-специјалисти пружају услуге. Ординација ради тако што пацијенти претходно заказују термине доласка. Сваки заказани термин може бити остварен или неостварен (ако пацијент не дође). Приликом сваког оствареног термина пацијента може имати један или више третмана приликом којих му се пружа услуга од стране одређеног лекара. По окончању термина пацијенту се испоставља рачун са ставкама од којих свака одговара једном третману. Рачун се плаћа у целини одмах или накнадно.

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. Навести по један пример сваког документа уколико би се за потребе наведене евиденције користила база података заснована на документима (mongoDB), али тако да модел искористи све предности нерелационог модела података.
  2. Саставити скрипт који користећи функцију за агрегацију (aggregation framework) враћа шифре оних пацијената који имају више од 3 рачуна након 2000 године са износом преко 15 хиљада.
  3. Саставити Map/Reduce посао који за сваки датум када је креиран бар један рачун враћа информацију о просечном броју ставки на њему.

1. задатак

Термин_Зак

{
    "_id": 1,
    "Datum": "03/29/2023",
    "Vreme": "19:48",
    // Termin_Ost
    "Trajanje": 2
}

Третман

{
    "_id": 1,
    "MedPod": "nesto",
    // Lekar
    "Lekar": {
        "Ime": "Marko Markovic"
    },
    // Usluga
    "Usluga": {
        "Naziv": "Masaza",
        "Cena": 3000
    },
    "Termin": 1
}

Рачун

{
    "_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. задатак

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. задатак

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

Тестирање