db.students.drop()

db.createCollection("students", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name", "age", "email" ],
         properties: {
            name: {
               bsonType: "string",
               description: "First- and lastname is required!"
            },
            age: {
               bsonType: "int",
               minimum: 15,
               maximum: 150,
               description: "The age ist required (15..150)!"
            },
            email: {
               bsonType: "string",
               pattern: "^[A-Za-z0-9._]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$",
               description: "Avalid email adress is required"
            },
            faculty: {
               enum: [ "Informatics", "Physics", "Mathematics", null ],
               description: "Use a valid faculty (Informatics, Physics, Mathematics or null)!"
            }
         }
      }
   }
})

db.students.insertOne({ "name": "Thomas Griesmayer" })
db.students.insertOne({ "name": "Thomas Griesmayer", "age": -3 })
db.students.insertOne({ "name": "Thomas Griesmayer", "age": 19 })
db.students.insertOne({ "name": "Thomas Griesmayer", "age": 19, "email": "thomas@demo" })
db.students.insertOne({ "name": "Thomas Griesmayer", "age": 19, "email": "thomas@demo.com" })



db.lectures.drop()

db.createCollection("lectures", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name", "semester" ],
         properties: {
            name: {
               bsonType: "string",
               description: "Name of the lecture is required!"
            },
            semester: {
               bsonType: "object",
               description: "Semester of the lecture is required!",
               required: [ "semesterid" ],
               properties: {
                  semesterid: {
                     bsonType: "int",
                     minimum: 1,
                     maximum: 8,
                     description: "The semester ist required (1..8)!"
                  },
                  semestername: {
                     bsonType: "string",
                     pattern: "^[WS]S[0-9]{4}$",
                     description: "The year and semester of the lecture is not required!"
                  },
                  classname: {
                     bsonType: "string",
                     description: "The class of the lecture!"
                  },
                  faculty: {
                     enum: [ "Informatics", "Physics", "Mathematics" ],
                     description: "Use a valid faculty (Informatics, Physics or Mathematics)!"
                  }
               }
            },
            grades: {
               bsonType: "array",
               description: "Minimum 10 Students are required",
               minItems: 10,
               items: {
                 bsonType: "object",
                 description: "The students and their grades!",
                 required: [ "student_id", "grade" ],
                 properties: {
                    student_id: {
                       description: "The id of the student!"
                    },
                    grade: {
                       enum: [ "1", "2", "3", "4", "5", "nicht Beurteilt", "befreit", null ],
                       description: "The grade of the student!"
                    }
                 }
               }
            }
         }
      }
   }
})

db.lectures.createIndex({ "grades.student_id":1 }, {})

db.lectures.insertOne({ name: "Introduction Java",   semester: { semesterid: 1 } })
db.lectures.insertOne({ name: "Introduction Oracle", semester: { semesterid: 1, semestername: "WS2023", classname: "3AKIF", faculty: "Informatics" } })
db.lectures.insertOne({ name: "Introduction Oracle", semester: { semesterid: 1, semestername: "WS2023", classname: "3AKIF", faculty: "Informatics" },
                        grades: [ {student_id: "1", grade: "4"},                {student_id: "2", grade: "2"},        {student_id: "3", grade: "1"},  {student_id: "4", grade: "5"},
                                  {student_id: "5", grade: "nicht Beurteilt"},  {student_id: "6", grade: "befreit"},  {student_id: "7", grade: "1"},  {student_id: "8", grade: "2"},
                                  {student_id: "9", grade: "1"},                {student_id: "10", grade: "3"},       {student_id: "11", grade: "2"} ] })
