3. MongoDB¶
MongoDB házi feladat, a teljesítéssel 4 pont és 3 iMsc pont szerezhető.
GitHub Classroom segítségével hozz létre magadnak egy repository-t. A meghívó URL-t Moodle-ben találod. Klónozd le az így elkészült repository-t. Ez tartalmazni fogja a megoldás elvárt szerkezetét. A feladatok elkészítése után kommitold és pushold a megoldásod.
A megoldáshoz szükséges szoftvereket és eszközöket lásd itt.
Előkészületként hozz létre egy új adatbázist, a gyakorlatanyagban leírt módon.
Feladat 0: Neptun kód¶
Első lépésként a gyökérben található neptun.txt
fájlba írd bele a Neptun kódodat!
Feladat 1: Legnagyobb összértékű termék a raktárban (2 pont)¶
A feladat meghatározni, hogy a raktárunkban egy adott kategóriába tartozó termékek közül melyik képviseli a legnagyobb összértéket — tehát melyik termék az, amelyiknek az ára szorozva a raktárban lévő mennyiségével a legnagyobb. Ehhez a ProductRepository
osztályban a következő metódust kell implementálnunk.
(string, double?) ProductWithLargestTotalValue(ObjectId categoryId)
-
A pontos specifikáció megértéséhez vizsgáljuk meg először a feladathoz tartozó teszteket a
TestExercise1.cs
fájlban.- A függvény bemeneti paramétere a kategória ID-ja, amelyhez tartozó termékekre éppen kíváncsiak vagyunk.
- Amennyiben tartozik termék a megadott kategóriához, akkor a legnagyobb összértékű termék nevét és az összértéket kell visszaadnunk.
- Amennyiben nem tartozik termék a kategóriához, mind a két értékre
null
-t kell visszaadnunk.
-
A lekérdezés elvégzéséhez a MongoDB aggregációs pipeline-ját érdemes használni. Ennek működésének felelevenítéséhez nézd meg a gyakorlatfeladatok megoldását.
A lekérdezéshez a következő pipeline lépések szükségesek:
-
Szűrjük le a termékeket a megadott kategóriához tartozókra. Ehhez egy $match (
Match
) lépésre lesz szükségünk, ahol megadhatjuk a megfelelő filter kifejezést. -
Számoljuk ki minden megmaradt termék esetén az összértéket egy $project (
Project
) lépés segítségével. Ne felejtsd el, hogy az összérték mellett a termék nevére is szükségünk lesz! -
Rendezzük az így kapott dokumentumokat csökkenő sorrendbe az összérték alapján. Ehhez a $sort (
SortByDescending
) lépést tudjuk alkalmazni. -
A legnagyobb értékre vagyunk kíváncsiak, azaz az eredmények közül csupán az első érdekel minket. Azonban akkor sem szeretnénk hibát kapni, ha egyáltalán nem tartozott termék ehhez a kategóriához. Ezért a
FirstOrDefault
kiértékelő utasítást érdemes használni.
Ha esetleg ismeretlen lenne a
(string, double?)
szintaktika:return ("test", 0.0);
utasítás segítségével egyszerre két visszatérési értéket tudunk adni a függvénynek.
-
-
Készítsd el a függvény implementációját. A repository osztály konstruktorban megkapja az adatbázist és elmenti magának a használandó gyűjteményt, ezen keresztül érheted el az adatbázist.
A teszteléshez találsz unit teszteket a solution-ben. A teszteket Visual Studio-ban egyszerűen tudod futtatni, de ha mást használsz fejlesztéshez (pl. VS Code és/vagy dotnet cli
), akkor is tudsz teszteket futtatni. Az adatbázis eléréséhez a TestDbFactory
osztályban módosíthatod a connection stringet.
Tesztek
A tesztek az adatbázis kiinduló állapotát feltételezik. Futtasd le az adatbázis scriptet a kiinduló állapot visszaállításához.
A tesztek kódját NE módosítsd. Ha a teszteléshez szükséges, ideiglenesen beleszerkeszthetsz, de ügyelj rá, hogy az eredeti állapottal kommitold a megoldásod.
BEADANDÓ
A módosított C# forráskódot töltsd fel.
Emellett készíts egy képernyőképet Visual Studio-ból (vagy a fejlesztéshez használt eszközből, akár dotnet cli
is lehet), amelyben a vonatkozó teszteket lefuttattad. Látszódjon a repository osztály kódja és a tesztek futásának eredménye! A képet f1.png
néven mentsd el és add be a megoldásod részeként!
Ha dotnet test
-et használsz a teszt futtatásához, a képernyőképen látszódjon az összes teszt neve. Ehhez használd a -v n
kapcsolót a részletesebb naplózáshoz.
A képernyőképen levő forráskód tekintetében nem szükséges, hogy a végső megoldásban szereplő kód betűről betűre megegyezzen a képen és a feltöltött változatban. Tehát a tesztek sikeres lefutása után elkészített képernyőképet nem szükséges frissíteni, ha a forráskódban kisebb változtatást eszközölsz.
Feladat 2: Új termék beszúrása (2 pont)¶
A feladat egy új termék beszúrásához egy függvény készítése. A beszúráskor több feltételnek is meg kell felelni, amiket ellenőrizni kell a beszúrás előtt. Ehhez implementáld az InsertProduct(string name, string category, int vat)
függvényt
A következőkre kell figyelni a beszúráskor:
- Amennyiben adott névvel már van termék, dobj kivételt (ArgumentException
)
- Amennyiben a megadott category
nevű kategória még nincsen, dobj kivételt (ArgumentException
)
- Amennyiben a megadott vat
értékhez tartozik már név egy másik Product
példány esetén, akkor használd annak a nevét, egyébként vedd fel "VAT"
névvel a beszúrandó termékhez.
-
A repository osztály konstruktorát egészítsd ki, hogy legyenek kategóriák is elérhetőek. Ehhez vedd fel a kategóriához tartozó osztályt!
-
Készítsd el a függvény implementációját, a paraméterekkel kapcsolatos kikötéseket ellenőrizd mielőtt a beszúrást végrehajtod! Segítségedre vannak a
TestExercise2.cs
fájlban található tesztek.
BEADANDÓ
A módosított C# forráskódot töltsd fel! Emellett készíts egy képernyőképet az első feladathoz hasonlóan, amelyben a vonatkozó teszteket lefuttattad! A képet f2.png
néven mentsd el és add be a megoldásod részeként!
Feladat 3: Raktár méret becslés (3 iMsc pont)¶
Egy cég új telephelyre költözik. A vezetésnek szüksége van arra az információra, hogy át tudják-e költöztetni a már meglévő raktárkészletet az új raktárba. Implementáld a függvényt, amely kiszámolja a teljes raktárkészletre a csomagok térfogatát!
A termékeink egy részénél van méret információ a description.product.package_parameters
alatt:
Ebből kell kiszámolni a teljes raktárkészlet térfogatát:
- Az adatot a
package_parameters
-ből vedd (és ne aproduct_size
-ból). - Egy termék lehet, hogy több csomagból áll, ezt a
package_parameters.number_of_packages
-ben találod. Ez csak egy szorzó, tehát egyetlen mérete van minden terméknek, legfeljebb több, ugyanakkora csomagból áll. - A végeredmény: minden termékre Σ (termék raktárkészlet * csomag darabszám * szélesség * hosszússág * mélység).
- Amely terméknél nincs meg ez az információ, ott 0 térfogattal számolj.
- Ügyelj rá, hogy a térfogat számítás mértékegység helyes legyen: a termékek mérete vagy cm vagy m mértékegységben lehet megadva, de a végeredményben a térfogat köbméterben kell!
Készítsd el a double GetAllProductsCumulativeVolume()
függvény implementációját, amely a teljes térfogatot visszaadja m^3-ben. A számítást adatbázisban végezd (és ne C#-ban), ehhez használd az aggregációs pipeline-t.
Sum aggregáció
Az aggregáláshoz a $group
pipeline stage-re lesz szükséged. Bár nem akarunk csoportosítani, mégis, így van lehetőség a teljes gyűjteményen aggregálásra. Minden termék elemet ugyanabba a csoportba képezz le (tehát, a $group
-ban az id
-hoz egy konstanst rendelj), majd a projekció részben végezheted el a $sum
típusú aggregálást a fenti képletnek megfelelően.
A cm és m mértékegység kezelés csak egy szorzót jelent, a sum
összegzésben meg tudod oldani egy feltételes szorzással. Ha ez nem sikerül, megoldhatod két külön aggregációval is, amelyekben szűrsz a mértékegységre majd utána jön az aggregáció.
A szükséges adatok nincsenek leképezve C# entitásra, ezeket neked kell elkészítened. Ügyelj rá, hogy a BSON dokumentumban az elemek neve eltér a szokásostól, így amikor C# property-re képezed le, vagy ennek megfelelően kell elnevezni a property-ket, vagy használhatod a [BsonElement(elementName: "...")]
attribútumot.
Figyelj oda, hogy a módosításaid ne rontsák el a 2. feladat megoldását, így ha kell a beszúrást módosítsd úgy, hogy a termék méretei 1x1x1 cm-esek legyenek, a többi nem megadott változót vedd fel általad választott értékekkel!
Fluent Api-t használj
Mindenképpen C#-os Fluent Api-t használj! Ne BsonDocument
-ben írd meg a lekérdezést!
Ha sikerült implementálni a metódust, akkor a korábban már látott módon a TestExercise3
osztályban található teszt metódussal ellenőrizni tudod a működést. A teszt az adatbázis kiinduló állapotát feltételezi.
BEADANDÓ
A módosított C# forráskódot töltsd fel.