ИЕП/К1 Јун 2022 — разлика између измена
< ИЕП
Пређи на навигацију
Пређи на претрагу
(Junski K1 po Ognjenovom predanju) |
(решен је) |
||
(Није приказана једна међуизмена другог корисника) | |||
Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
'''Први колоквијум у јунском року 2022. године''' одржан је 17. јуна. Била је дозвољена употреба материјала са предавања. | '''Први колоквијум у јунском року 2022. године''' одржан је 17. јуна. Била је дозвољена употреба материјала са предавања. | ||
Ред 20: | Ред 19: | ||
# Саставити Map/Reduce посао који за сваки датум када је креиран бар један рачун враћа информацију о просечном броју ставки на њему. | # Саставити Map/Reduce посао који за сваки датум када је креиран бар један рачун враћа информацију о просечном броју ставки на њему. | ||
</div> | </div> | ||
== 1. задатак == | |||
=== Термин_Зак === | |||
<syntaxhighlight lang="javascript"> | |||
{ | |||
"_id": 1, | |||
"Datum": "03/29/2023", | |||
"Vreme": "19:48", | |||
// Termin_Ost | |||
"Trajanje": 2 | |||
} | |||
</syntaxhighlight> | |||
=== Третман === | |||
<syntaxhighlight lang="javascript"> | |||
{ | |||
"_id": 1, | |||
"MedPod": "nesto", | |||
// Lekar | |||
"Lekar": { | |||
"Ime": "Marko Markovic" | |||
}, | |||
// Usluga | |||
"Usluga": { | |||
"Naziv": "Masaza", | |||
"Cena": 3000 | |||
}, | |||
"Termin": 1 | |||
} | |||
</syntaxhighlight> | |||
== | === Рачун === | ||
<syntaxhighlight lang="javascript"> | |||
{ | |||
"_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" | |||
} | |||
} | |||
</syntaxhighlight> | |||
== 2. задатак == | == 2. задатак == | ||
<syntaxhighlight lang="javascript"> | |||
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 | |||
} | |||
} | |||
]); | |||
</syntaxhighlight> | |||
== 3. задатак == | == 3. задатак == | ||
<syntaxhighlight lang="javascript> | |||
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 | |||
}); | |||
</syntaxhighlight> | |||
== Тестирање == | == Тестирање == |
Тренутна верзија на датум 8. март 2024. у 22:55
Први колоквијум у јунском року 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)
- Навести по један пример сваког документа уколико би се за потребе наведене евиденције користила база података заснована на документима (mongoDB), али тако да модел искористи све предности нерелационог модела података.
- Саставити скрипт који користећи функцију за агрегацију (aggregation framework) враћа шифре оних пацијената који имају више од 3 рачуна након 2000 године са износом преко 15 хиљада.
- Саставити 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
});