commit 3cc4ae569930714522517c7d67048ee8540e9ff4 Author: Jannis Date: Wed Feb 19 18:52:20 2025 +0000 init Signed-off-by: Jannis diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..6fd511e Binary files /dev/null and b/.DS_Store differ diff --git a/Feldmann.Jannis.json b/Feldmann.Jannis.json new file mode 100644 index 0000000..76673d4 --- /dev/null +++ b/Feldmann.Jannis.json @@ -0,0 +1,17 @@ +[ + { + "_id": { + "$oid": "67b48eca0608f20a258e2013" + }, + "name": "Jannis Feldmann", + "adresse": "Giessenstrasse 12c", + "plz": 8608, + "ort": "Bubikon", + "geburtsdatum": "2000-08-15T00:00:00Z", + "email": "jannis@epilogue.team", + "hobbies": ["Programmieren", "Sport", "Musik"], + "letztesLogin": { + "$date": "2024-02-18T14:45:00.000Z" + } + } +] diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ccb398 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ + +# KN01 +[KN01](KN01/readme.md) + +# KN02 +[KN02](KN02/readme.md) + +# KN03 +[KN03](KN03/readme.md) + +# KN04 +[KN04](KN04/readme.md) + +# KN05 +[KN05](KN05/readme.md) \ No newline at end of file diff --git a/Screenshot 2025-02-18 at 14.39.04.png b/Screenshot 2025-02-18 at 14.39.04.png new file mode 100644 index 0000000..0fca097 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.39.04.png differ diff --git a/Screenshot 2025-02-18 at 14.41.42.png b/Screenshot 2025-02-18 at 14.41.42.png new file mode 100644 index 0000000..1218968 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.41.42.png differ diff --git a/Screenshot 2025-02-18 at 14.45.09.png b/Screenshot 2025-02-18 at 14.45.09.png new file mode 100644 index 0000000..28fb0f6 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.45.09.png differ diff --git a/Screenshot 2025-02-18 at 14.46.52.png b/Screenshot 2025-02-18 at 14.46.52.png new file mode 100644 index 0000000..16ea699 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.46.52.png differ diff --git a/Screenshot 2025-02-18 at 14.51.27.png b/Screenshot 2025-02-18 at 14.51.27.png new file mode 100644 index 0000000..d9584aa Binary files /dev/null and b/Screenshot 2025-02-18 at 14.51.27.png differ diff --git a/Screenshot 2025-02-18 at 14.52.44.png b/Screenshot 2025-02-18 at 14.52.44.png new file mode 100644 index 0000000..b91da33 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.52.44.png differ diff --git a/Screenshot 2025-02-18 at 14.56.34.png b/Screenshot 2025-02-18 at 14.56.34.png new file mode 100644 index 0000000..07d68a1 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.56.34.png differ diff --git a/Screenshot 2025-02-18 at 14.58.50.png b/Screenshot 2025-02-18 at 14.58.50.png new file mode 100644 index 0000000..dd1f01b Binary files /dev/null and b/Screenshot 2025-02-18 at 14.58.50.png differ diff --git a/Screenshot 2025-02-18 at 14.59.23.png b/Screenshot 2025-02-18 at 14.59.23.png new file mode 100644 index 0000000..732a3e9 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.59.23.png differ diff --git a/Screenshot 2025-02-18 at 14.59.38.png b/Screenshot 2025-02-18 at 14.59.38.png new file mode 100644 index 0000000..77060e5 Binary files /dev/null and b/Screenshot 2025-02-18 at 14.59.38.png differ diff --git a/Screenshot 2025-02-18 at 15.30.49.png b/Screenshot 2025-02-18 at 15.30.49.png new file mode 100644 index 0000000..b12ce42 Binary files /dev/null and b/Screenshot 2025-02-18 at 15.30.49.png differ diff --git a/aggregation_1.js b/aggregation_1.js new file mode 100644 index 0000000..11f34d5 --- /dev/null +++ b/aggregation_1.js @@ -0,0 +1,115 @@ +print("Anspruchsvolle Shooter-Spiele (mit separaten $match Stages):"); +db.spiele + .aggregate([ + { $match: { genre: "Tactical Shooter" } }, + { $match: { schwierigkeitsgrad: "Hoch" } }, + ]) + .forEach(printjson); + +print("\nSpieler Performance Übersicht:"); +db.spieler + .aggregate([ + { + $match: { + gesamtpunktzahl: { $gt: 1000 }, + }, + }, + { + $project: { + _id: 0, + username: 1, + performance_metrics: { + punktzahl: "$gesamtpunktzahl", + durchschnittliche_kd: { + $avg: "$spielstatistiken.k_d_ratio", + }, + gesamt_spielzeit: { + $sum: "$spielstatistiken.spielzeit_minuten", + }, + }, + }, + }, + { + $sort: { + "performance_metrics.punktzahl": -1, + }, + }, + ]) + .forEach(printjson); + +print("\nGesamtstatistiken über alle Spieler:"); +db.spieler + .aggregate([ + { + $group: { + _id: null, + total_players: { $sum: 1 }, + gesamtpunktzahl: { $sum: "$gesamtpunktzahl" }, + durchschnittspunktzahl: { $avg: "$gesamtpunktzahl" }, + }, + }, + ]) + .forEach(printjson); + +print("\nAchievement-Statistiken nach Schwierigkeitsgrad:"); +db.achievements + .aggregate([ + { + $group: { + _id: "$schwierigkeit", + anzahl_achievements: { $sum: 1 }, + durchschnittspunkte: { $avg: "$punktewert" }, + gesamtpunkte: { $sum: "$punktewert" }, + achievements: { + $push: { + name: "$name", + punktewert: "$punktewert", + }, + }, + }, + }, + { + $sort: { + durchschnittspunkte: -1, + }, + }, + ]) + .forEach(printjson); + +print("\nDurchschnittliche Leistung pro Spiel:"); +db.spieler + .aggregate([ + { $unwind: "$spielstatistiken" }, + { + $group: { + _id: "$spielstatistiken.spiel_id", + anzahl_spieler: { $sum: 1 }, + durchschnitt_kd: { $avg: "$spielstatistiken.k_d_ratio" }, + gesamt_siege: { $sum: "$spielstatistiken.siege" }, + gesamt_niederlagen: { $sum: "$spielstatistiken.niederlagen" }, + durchschnitt_spielzeit: { $avg: "$spielstatistiken.spielzeit_minuten" }, + }, + }, + { + $lookup: { + from: "spiele", + localField: "_id", + foreignField: "_id", + as: "spielinfo", + }, + }, + { + $project: { + _id: 0, + spiel: { $arrayElemAt: ["$spielinfo.spielname", 0] }, + statistiken: { + spieler: "$anzahl_spieler", + kd_ratio: { $round: ["$durchschnitt_kd", 2] }, + siege: "$gesamt_siege", + niederlagen: "$gesamt_niederlagen", + avg_spielzeit: { $round: ["$durchschnitt_spielzeit", 0] }, + }, + }, + }, + ]) + .forEach(printjson); diff --git a/cloud-init.yml b/cloud-init.yml new file mode 100644 index 0000000..a0af641 --- /dev/null +++ b/cloud-init.yml @@ -0,0 +1,51 @@ +#cloud-config +users: + - name: ubuntu + sudo: ALL=(ALL) NOPASSWD:ALL + groups: users, admin + home: /home/ubuntu + shell: /bin/bash + ssh_authorized_keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCPIIO8uY8oWIihDv0tCAbX6toyG1RYkaLZyfGD1L+I07K4CnwAVBSU+81vw3Yv5sN9tj2Ccve9kzEeCNMld2mDP/Tt7edkx2MCToVfVx+njqwY/XbMY9bfdRKJLhIoLavuVNLnnkSIXdtlGr3JF71hPHzBDMEo64ofPCQ8hPsGxL1u3efb12jcWcRhudKtv7Qh6cVE47Zj4xImfi6VlLqwzcKZ5oCqR/z1hLLL+/pS3eM5Qsor5wmAqNfH4+z5eE+pOkFm7a0Nkygv9jwXIqtJzFGKYDe6ciBD04pEovdvY0FTyiv2vksQOVgjtu2faG2Iv1HOG0JktCIwJ49OEgjT teacher-key + - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKgdN/WkRYNDPLa06pBFByEMfkT+ic8XjL+WG4VcXVtN jannisfeldmann@MacBook-Air-von-Jannis.local + +ssh_pwauth: false +disable_root: false +package_update: true +packages: + - unzip + - gnupg + - curl + +write_files: + - path: /home/ubuntu/mongodconfupdate.sh + content: | + sudo sed -i 's/#security:/security:\n authorization: enabled/g' /etc/mongod.conf + - path: /home/ubuntu/mongodbuser.txt + content: | + use admin; + db.createUser( + { + user: "admin", + pwd: "MyPassword.42", + roles: [ + { role: "userAdminAnyDatabase", db: "admin" }, + { role: "readWriteAnyDatabase", db: "admin" }, + { role: "root", db: "admin" } + ] + } + ); + +runcmd: + - curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor + - echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list + - sudo apt-get update -y + - sudo apt-get install -y mongodb-org + - sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mongod.conf + - sudo chmod +x /home/ubuntu/mongodconfupdate.sh + - sudo /home/ubuntu/mongodconfupdate.sh + - sudo systemctl enable mongod + - sudo systemctl start mongod + - sleep 10 + - mongosh < /home/ubuntu/mongodbuser.txt + - sudo systemctl restart mongod \ No newline at end of file diff --git a/create_data.js b/create_data.js new file mode 100644 index 0000000..ecef0d3 --- /dev/null +++ b/create_data.js @@ -0,0 +1,153 @@ +const valorantId = new ObjectId(); +const csgoId = new ObjectId(); +const apexId = new ObjectId(); + +db.spiele.insertMany([ + { + _id: valorantId, + spielname: "Valorant", + genre: "Tactical Shooter", + schwierigkeitsgrad: "Hoch", + }, + { + _id: csgoId, + spielname: "CS:GO", + genre: "Tactical Shooter", + schwierigkeitsgrad: "Hoch", + }, + { + _id: apexId, + spielname: "Apex Legends", + genre: "Battle Royale", + schwierigkeitsgrad: "Mittel", + }, +]); + +const player1Id = new ObjectId(); +const player2Id = new ObjectId(); +const player3Id = new ObjectId(); +const player4Id = new ObjectId(); + +db.spieler.insertOne({ + _id: player1Id, + username: "ProGamer123", + email: "progamer@gaming.com", + registrierungsdatum: new Date("2024-01-15"), + gesamtpunktzahl: 2500, + rang: 1, + spielstatistiken: [ + { + spiel_id: valorantId, + punktzahl: 1500, + siege: 42, + niederlagen: 18, + k_d_ratio: 1.8, + spielzeit_minuten: 1800, + letztes_spiel: new Date("2024-02-15"), + }, + { + spiel_id: csgoId, + punktzahl: 1000, + siege: 35, + niederlagen: 25, + k_d_ratio: 1.5, + spielzeit_minuten: 1500, + letztes_spiel: new Date("2024-02-10"), + }, + ], +}); + +db.spieler.insertMany([ + { + _id: player2Id, + username: "GameMaster99", + email: "master99@gaming.com", + registrierungsdatum: new Date("2024-01-20"), + gesamtpunktzahl: 2200, + rang: 2, + spielstatistiken: [ + { + spiel_id: valorantId, + punktzahl: 1200, + siege: 38, + niederlagen: 22, + k_d_ratio: 1.6, + spielzeit_minuten: 1600, + letztes_spiel: new Date("2024-02-14"), + }, + ], + }, + { + _id: player3Id, + username: "NoobSlayer", + email: "slayer@gaming.com", + registrierungsdatum: new Date("2024-02-01"), + gesamtpunktzahl: 1800, + rang: 3, + spielstatistiken: [ + { + spiel_id: apexId, + punktzahl: 1800, + siege: 25, + niederlagen: 15, + k_d_ratio: 2.1, + spielzeit_minuten: 900, + letztes_spiel: new Date("2024-02-16"), + }, + ], + }, +]); + +const achievement1Id = new ObjectId(); +const achievement2Id = new ObjectId(); +const achievement3Id = new ObjectId(); + +db.achievements.insertMany([ + { + _id: achievement1Id, + name: "Flawless Victory", + beschreibung: "Gewinne ein Spiel ohne zu sterben", + punktewert: 500, + schwierigkeit: "Sehr Hoch", + errungen_von: [ + { + spieler_id: player1Id, + erreicht_am: new Date("2024-02-01"), + }, + ], + }, + { + _id: achievement2Id, + name: "First Blood", + beschreibung: "Erziele den ersten Kill in 50 Spielen", + punktewert: 200, + schwierigkeit: "Mittel", + errungen_von: [ + { + spieler_id: player1Id, + erreicht_am: new Date("2024-01-20"), + }, + { + spieler_id: player2Id, + erreicht_am: new Date("2024-02-05"), + }, + ], + }, + { + _id: achievement3Id, + name: "Veteran", + beschreibung: "Spiele 100 Stunden", + punktewert: 300, + schwierigkeit: "Niedrig", + errungen_von: [ + { + spieler_id: player1Id, + erreicht_am: new Date("2024-02-10"), + }, + { + spieler_id: player3Id, + erreicht_am: new Date("2024-02-15"), + }, + ], + }, +]); diff --git a/db.drawio b/db.drawio new file mode 100644 index 0000000..e7a3899 --- /dev/null +++ b/db.drawio @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/db.js b/db.js new file mode 100644 index 0000000..fbb8bc6 --- /dev/null +++ b/db.js @@ -0,0 +1,5 @@ +db.createCollection("spieler"); + +db.createCollection("spiele"); + +db.createCollection("achievements"); diff --git a/db.png b/db.png new file mode 100644 index 0000000..cb224bc Binary files /dev/null and b/db.png differ diff --git a/delete_data_1.js b/delete_data_1.js new file mode 100644 index 0000000..2170bd7 --- /dev/null +++ b/delete_data_1.js @@ -0,0 +1,3 @@ +db.spieler.drop(); +db.spiele.drop(); +db.achievements.drop(); diff --git a/delete_data_2.js b/delete_data_2.js new file mode 100644 index 0000000..087571c --- /dev/null +++ b/delete_data_2.js @@ -0,0 +1,9 @@ +const playerToDeleteId = new ObjectId("65c4d2e6b3c72d3c45a77777"); +const achievement1ToDeleteId = new ObjectId("65c4d2e6b3c72d3c45a88888"); +const achievement2ToDeleteId = new ObjectId("65c4d2e6b3c72d3c45a99999"); + +db.spieler.deleteOne({ _id: playerToDeleteId }); + +db.achievements.deleteMany({ + $or: [{ _id: achievement1ToDeleteId }, { _id: achievement2ToDeleteId }], +}); diff --git a/join_aggregation.js b/join_aggregation.js new file mode 100644 index 0000000..1c007bc --- /dev/null +++ b/join_aggregation.js @@ -0,0 +1,213 @@ +print("Spieler mit Details ihrer Achievements:"); +db.spieler + .aggregate([ + { + $lookup: { + from: "achievements", + let: { spielerId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { + $in: ["$$spielerId", "$errungen_von.spieler_id"], + }, + }, + }, + ], + as: "erreichte_achievements", + }, + }, + { + $project: { + username: 1, + gesamtpunktzahl: 1, + achievements: { + $map: { + input: "$erreichte_achievements", + as: "achievement", + in: { + name: "$$achievement.name", + punktewert: "$$achievement.punktewert", + schwierigkeit: "$$achievement.schwierigkeit", + }, + }, + }, + }, + }, + ]) + .forEach(printjson); + +print("\nDetailierte Spieleranalyse mit Spiel- und Achievement-Informationen:"); +db.spieler + .aggregate([ + { $unwind: "$spielstatistiken" }, + + { + $lookup: { + from: "spiele", + localField: "spielstatistiken.spiel_id", + foreignField: "_id", + as: "spiel_details", + }, + }, + + { + $lookup: { + from: "achievements", + let: { spielerId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { + $in: ["$$spielerId", "$errungen_von.spieler_id"], + }, + }, + }, + ], + as: "achievements", + }, + }, + + { + $project: { + _id: 0, + spieler: "$username", + spiel: { $arrayElemAt: ["$spiel_details.spielname", 0] }, + genre: { $arrayElemAt: ["$spiel_details.genre", 0] }, + leistung: { + siege: "$spielstatistiken.siege", + niederlagen: "$spielstatistiken.niederlagen", + k_d_ratio: "$spielstatistiken.k_d_ratio", + spielzeit: "$spielstatistiken.spielzeit_minuten", + }, + achievements: { + anzahl: { $size: "$achievements" }, + gesamtpunkte: { $sum: "$achievements.punktewert" }, + liste: "$achievements.name", + }, + }, + }, + + { + $match: { + "leistung.k_d_ratio": { $gt: 1.5 }, + }, + }, + + { + $sort: { + "leistung.k_d_ratio": -1, + }, + }, + ]) + .forEach(printjson); + +print("\nSpiel-Achievement-Analyse:"); +db.spiele + .aggregate([ + { + $lookup: { + from: "achievements", + let: { spielId: "$_id" }, + pipeline: [ + { + $match: { + $expr: { + $gt: [{ $size: "$errungen_von" }, 1], + }, + }, + }, + ], + as: "spiel_achievements", + }, + }, + + { + $lookup: { + from: "spieler", + let: { spielId: "$_id" }, + pipeline: [ + { $unwind: "$spielstatistiken" }, + { + $match: { + $expr: { + $eq: ["$spielstatistiken.spiel_id", "$$spielId"], + }, + }, + }, + ], + as: "spieler_stats", + }, + }, + + { + $project: { + spielname: 1, + genre: 1, + schwierigkeitsgrad: 1, + statistiken: { + aktive_spieler: { $size: "$spieler_stats" }, + durchschnitt_kd: { + $avg: "$spieler_stats.spielstatistiken.k_d_ratio", + }, + gesamt_spielzeit: { + $sum: "$spieler_stats.spielstatistiken.spielzeit_minuten", + }, + achievements: { + anzahl: { $size: "$spiel_achievements" }, + schwierigkeitsverteilung: { + $reduce: { + input: "$spiel_achievements", + initialValue: { einfach: 0, mittel: 0, schwer: 0 }, + in: { + einfach: { + $add: [ + "$$value.einfach", + { + $cond: [ + { $eq: ["$$this.schwierigkeit", "Niedrig"] }, + 1, + 0, + ], + }, + ], + }, + mittel: { + $add: [ + "$$value.mittel", + { + $cond: [ + { $eq: ["$$this.schwierigkeit", "Mittel"] }, + 1, + 0, + ], + }, + ], + }, + schwer: { + $add: [ + "$$value.schwer", + { + $cond: [ + { $eq: ["$$this.schwierigkeit", "Sehr Hoch"] }, + 1, + 0, + ], + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + + { + $sort: { + "statistiken.aktive_spieler": -1, + }, + }, + ]) + .forEach(printjson); diff --git a/read_data.js b/read_data.js new file mode 100644 index 0000000..55903d4 --- /dev/null +++ b/read_data.js @@ -0,0 +1,44 @@ + +print("Neue Spieler seit 15. Januar 2024:"); +db.spieler.find( + { registrierungsdatum: { $gt: new Date("2024-01-15") } }, + { username: 1, registrierungsdatum: 1 } +).forEach(printjson); + + +print("\nTop Performer (hohe Punktzahl oder viele Siege):"); +db.spieler.find({ + $or: [ + { gesamtpunktzahl: { $gt: 2000 } }, + { "spielstatistiken.siege": { $gt: 40 } } + ] +}).forEach(printjson); + +print("\nAnspruchsvolle Shooter-Spiele:"); +db.spiele.find({ + $and: [ + { genre: "Tactical Shooter" }, + { schwierigkeitsgrad: "Hoch" } + ] +}).forEach(printjson); + +print("\nSpieler mit 'Pro' oder 'Game' im Namen:"); +db.spieler.find( + { username: { $regex: /Pro|Game/i } }, + { _id: 0, username: 1, gesamtpunktzahl: 1 } +).forEach(printjson); + +print("\nBegehrte Achievements:"); +db.achievements.find({ + punktewert: { $gt: 200 }, + "errungen_von.1": { $exists: true } +}).forEach(printjson); + +print("\nValorant Spielerstatistiken:"); +db.spieler.find( + { "spielstatistiken.punktzahl": { $gt: 1000 } }, + { + username: 1, + "spielstatistiken.$": 1 + } +).forEach(printjson); \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..ddb7f7f --- /dev/null +++ b/readme.md @@ -0,0 +1,18 @@ +# A: Konzeptionelles Datenmodell + +![alt text]() + + + +# B: Logisches Modell für MongoDB + +![alt text]() +Spiele werden als eigene collection gespeichert, weil sie von vielen Spielern referenziert werden und selten geändert werden. Das vermeidet auch duplikate. + +Achievements werden häufig nach allen Spielern gefiltert, die sie erreicht haben. +"errungen_von" speichert, welche Spieler ein Achievement erreicht haben. + +# C: Anwendung des Schemas in MongoDB + +[db.js](db.js) + diff --git a/unter_dokumente.js b/unter_dokumente.js new file mode 100644 index 0000000..d48a573 --- /dev/null +++ b/unter_dokumente.js @@ -0,0 +1,106 @@ +print("Spielstatistiken aller Spieler:"); +db.spieler + .find({}, { _id: 0, username: 1, spielstatistiken: 1 }) + .forEach(printjson); + +print("\nSpieler mit K/D-Ratio über 1.8 in irgendeinem Spiel:"); +db.spieler + .find( + { + "spielstatistiken.k_d_ratio": { $gt: 1.8 }, + }, + { + username: 1, + spielstatistiken: { + $filter: { + input: "$spielstatistiken", + as: "stat", + cond: { $gt: ["$$stat.k_d_ratio", 1.8] }, + }, + }, + } + ) + .forEach(printjson); + +print("\nVerflachte Spielerstatistiken:"); +db.spieler + .aggregate([ + { $unwind: "$spielstatistiken" }, + + { + $match: { + "spielstatistiken.spielzeit_minuten": { $gt: 1000 }, + }, + }, + + { + $project: { + _id: 0, + spieler: "$username", + spiel_id: "$spielstatistiken.spiel_id", + statistiken: { + siege: "$spielstatistiken.siege", + niederlagen: "$spielstatistiken.niederlagen", + k_d_ratio: "$spielstatistiken.k_d_ratio", + spielzeit: "$spielstatistiken.spielzeit_minuten", + letztes_spiel: "$spielstatistiken.letztes_spiel", + }, + }, + }, + + { + $sort: { + "statistiken.k_d_ratio": -1, + }, + }, + ]) + .forEach(printjson); + +print("\nDurchschnittliche Statistiken pro Spiel:"); +db.spieler + .aggregate([ + { $unwind: "$spielstatistiken" }, + + { + $group: { + _id: "$spielstatistiken.spiel_id", + anzahl_spieler: { $sum: 1 }, + durchschnitt_kd: { $avg: "$spielstatistiken.k_d_ratio" }, + gesamt_spielzeit: { $sum: "$spielstatistiken.spielzeit_minuten" }, + gesamt_siege: { $sum: "$spielstatistiken.siege" }, + gesamt_niederlagen: { $sum: "$spielstatistiken.niederlagen" }, + }, + }, + + { + $lookup: { + from: "spiele", + localField: "_id", + foreignField: "_id", + as: "spiel_info", + }, + }, + + { + $project: { + _id: 0, + spiel: { $arrayElemAt: ["$spiel_info.spielname", 0] }, + statistiken: { + spieler: "$anzahl_spieler", + avg_kd: { $round: ["$durchschnitt_kd", 2] }, + spielzeit_stunden: { + $round: [{ $divide: ["$gesamt_spielzeit", 60] }, 1], + }, + siege: "$gesamt_siege", + niederlagen: "$gesamt_niederlagen", + }, + }, + }, + + { + $sort: { + "statistiken.spieler": -1, + }, + }, + ]) + .forEach(printjson); diff --git a/update_data.js b/update_data.js new file mode 100644 index 0000000..a82ec6c --- /dev/null +++ b/update_data.js @@ -0,0 +1,50 @@ +const playerToUpdateId = new ObjectId("65c4d2e6b3c72d3c45a77777"); + +db.spieler.updateOne( + { _id: playerToUpdateId }, + { + $set: { + gesamtpunktzahl: 3000, + rang: 1, + }, + $push: { + spielstatistiken: { + spiel_id: new ObjectId("65c4d2e6b3c72d3c45a66666"), + punktzahl: 500, + siege: 15, + niederlagen: 5, + k_d_ratio: 2.0, + spielzeit_minuten: 300, + letztes_spiel: new Date(), + }, + }, + } +); + +db.spiele.updateMany( + { + $or: [{ genre: "Tactical Shooter" }, { genre: "Battle Royale" }], + }, + { + $set: { + version: "2.0", + letztes_update: new Date(), + }, + } +); + +db.achievements.replaceOne( + { name: "First Blood" }, + { + name: "First Blood Pro", + beschreibung: "Erziele den ersten Kill in 100 Spielen", + punktewert: 500, + schwierigkeit: "Sehr Hoch", + errungen_von: [], + anforderungen: { + anzahl_spiele: 100, + zeitlimit_tage: 30, + mindest_kdRatio: 1.5, + }, + } +); diff --git a/user_creation.js b/user_creation.js new file mode 100644 index 0000000..a443983 --- /dev/null +++ b/user_creation.js @@ -0,0 +1,22 @@ +use gaming + +db.createUser({ + user: "readOnlyUser", + pwd: "readOnly123", + roles: [ + { role: "read", db: "gaming" } + ] +}) + +use admin + +db.createUser({ + user: "readWriteUser", + pwd: "readWrite123", + roles: [ + { role: "readWrite", db: "gaming" } + ] +}) + +use admin +db.system.users.find({}, {user: 1, db: 1, roles: 1}) \ No newline at end of file