Zum Inhalt springen

Aufgabe 10 - MongoDB

Zu Zen-Modus wechseln

In dieser Übung werden die Grundkonzepte einer dokumentenorientierten NoSQL-Datenbank ausprobiert: JSON-Testdaten erzeugen, MongoDB per Docker starten, importieren, abfragen und mit der Aggregation Pipeline auswerten (siehe Kapitel 4 - DBMS Markt, Dokumentendatenbanken). Im Expertenteil geht es um komplexe Aggregationen und die Frage embedded gegen referenced.

  • Docker und Docker Compose.
  • Browserzugang zu generatedata.com; MongoDB Compass.
  • Kapitel 4 - DBMS Markt (Dokumentendatenbanken).
  • Sie erzeugen und importieren JSON-Dokumente.
  • Sie fragen Dokumente mit Filtern und Operatoren ab.
  • Sie werten Daten mit der Aggregation Pipeline aus.
  • Sie beurteilen das Datenmodell (embedded gegen referenced) und den Einsatz gegenüber relationalen Datenbanken.
  • Reproduktion: Testdaten erzeugen (Teil A).
  • Reorganisation und Transfer: importieren und einfach abfragen (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: aggregieren und das Modell beurteilen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. Auf generatedata.com einen Datensatz mit rund 500 Bestell-Dokumenten mit den Feldern order_id (GUID), order_date (Datum), customer_id, customer_name, email, country (AT/DE/CH), product_category (Electronics, Books, …), product_name, quantity, unit_price, total_amount, payment_method, order_status (pending … cancelled) erzeugen und als orders.json (Array von Objekten) exportieren.
  1. Einen Projektordner mongodb-lab/ mit docker-compose.yml (Services mongo:7 mit Root-User und mongo-express) anlegen und mit docker compose up -d starten; die Mongo-Express-UI unter http://localhost:8081 prüfen.

  2. Eine Datenbank ecommerce und eine Collection orders anlegen (per Mongo-Express oder mongosh).

  3. orders.json mit mongoimport --jsonArray importieren (über einen wegwerfbaren mongo:7-Container, der data/ mountet) und die Dokumentzahl prüfen:

    Terminal-Fenster
    docker exec mongodb mongosh -u admin -p mongodb-password --authenticationDatabase admin \
    -e "use ecommerce; db.orders.countDocuments()"
  1. find mit Filtern: alle Bestellungen mit order_status: "delivered" (Limit 10); Bestellungen eines Landes (country: "AT", auch DE/CH testen); Bestellungen mit total_amount größer 500 ($gt); Bestellungen ohne Kundennamen (null oder nicht vorhanden, meist 0).
  2. updateMany: alle pending-Bestellungen auf processing setzen und die Zahl der aktualisierten Dokumente notieren; die Beträge der PayPal-Bestellungen um 2 % erhöhen.

Teil D - Expertenteil: Aggregation Pipeline und Datenmodell

Abschnitt betitelt „Teil D - Expertenteil: Aggregation Pipeline und Datenmodell“
  1. Aggregationen: Formulieren Sie mit db.orders.aggregate([...]):
    • durchschnittliche Bestellsumme, Anzahl und Maximum je product_category, absteigend sortiert;
    • die Top 5 Länder nach summiertem total_amount;
    • Anzahl und Durchschnittsbetrag je Kombination aus payment_method und order_status (Gruppierung nach zwei Feldern);
    • eine Zeitreihe: Bestellungen je Tag und Kategorie (Datum mit $dateToString formatieren, gruppieren). Erklären Sie an einer dieser Abfragen die Rolle der Stufen $match, $group und $sort.
  2. Compass: Dieselbe „Top-Länder”-Auswertung im Aggregation Builder von MongoDB Compass nachbauen und im Schema-Tab die Feldtypen und ihre Häufigkeit betrachten. Ein Feld nennen, dessen Typ uneinheitlich ist (z. B. total_amount als Zahl und als String), und erklären, warum das in einem schemaflexiblen System passieren kann.
  3. Datenmodell beurteilen: Das aktuelle Dokument ist flach: Kundendaten (customer_id, customer_name, email, country) stehen in jeder Bestellung. Diskutieren Sie in vier bis fünf Sätzen, ob die Kundendaten besser eingebettet bleiben oder in eine eigene Collection referenziert werden sollten. Nennen Sie je ein Argument für beide Varianten und entscheiden Sie begründet.
  4. NoSQL oder relational: In drei bis vier Sätzen begründen, für welche Anforderungen dieser Bestelldaten eine Dokumentendatenbank passt und wann eine relationale Datenbank die bessere Wahl wäre (etwa komplexe Joins, strenge Transaktionen über mehrere Entitäten).
  1. Worin unterscheidet sich ein MongoDB-Dokument von einer Tabellenzeile?
  2. Wozu dienen die Stufen $match, $group und $sort in einer Pipeline?
  3. Wann bettet man verwandte Daten ein, wann referenziert man sie?
  4. Warum kann in MongoDB dasselbe Feld unterschiedliche Typen haben?
  5. Für welche Anforderungen ist eine relationale Datenbank hier besser geeignet?
  • Das docker-compose.yml und ein Dokument mit JSON-Schema-Beschreibung, den ersten drei Dokumenten und der importierten Dokumentzahl.
  • Je Query (1–10) der Code, eine kurze Beschreibung und Beispielergebnisse; wo möglich Compass-Screenshots.
  • Die Aggregationen und die Datenmodell-Bewertung aus Teil D sowie ein README.md mit allen Docker- und Import-Befehlen.

HTL Villach, 2025-2026,
https://www.htl-villach.at