Section 11: Projects

πŸ“š Student Management System

Complete MongoDB project with interactive examples and live console

🎯 Project Overview

Build a complete student management system that handles student enrollment, courses, grades, attendance, and analytics. This project demonstrates real-world MongoDB usage with nested documents, arrays, and complex queries.

Features:

  • βœ… Student enrollment and profile management
  • βœ… Course registration and management
  • βœ… Grade tracking and GPA calculation
  • βœ… Attendance monitoring
  • βœ… Student performance analytics
  • βœ… Search and filtering capabilities

πŸ“‹ Database Schema Design

Students Collection

{
  _id: ObjectId("..."),
  student_id: "STU2024001",
  first_name: "Alice",
  last_name: "Johnson",
  email: "alice.johnson@university.edu",
  phone: "+1-555-0123",
  date_of_birth: ISODate("2002-05-15"),
  gender: "Female",
  
  address: {
    street: "123 Main St",
    city: "Boston",
    state: "MA",
    zip: "02101",
    country: "USA"
  },
  
  enrollment: {
    date: ISODate("2024-01-15"),
    program: "Computer Science",
    year: 2,
    status: "active"
  },
  
  courses: [
    {
      course_id: "CS101",
      course_name: "Introduction to Programming",
      credits: 3,
      semester: "Fall 2024",
      grade: "A",
      grade_points: 4.0
    },
    {
      course_id: "MATH201",
      course_name: "Calculus II",
      credits: 4,
      semester: "Fall 2024",
      grade: "B+",
      grade_points: 3.3
    }
  ],
  
  attendance: [
    {
      course_id: "CS101",
      date: ISODate("2024-09-01"),
      status: "present"
    },
    {
      course_id: "CS101",
      date: ISODate("2024-09-03"),
      status: "absent"
    }
  ],
  
  gpa: 3.65,
  total_credits: 45,
  
  created_at: ISODate("2024-01-15"),
  updated_at: ISODate("2024-12-20")
}

Courses Collection

{
  _id: ObjectId("..."),
  course_id: "CS101",
  course_name: "Introduction to Programming",
  department: "Computer Science",
  credits: 3,
  instructor: {
    name: "Dr. Robert Smith",
    email: "robert.smith@university.edu"
  },
  schedule: {
    days: ["Monday", "Wednesday", "Friday"],
    time: "10:00-11:00",
    room: "Building A - 201"
  },
  capacity: 30,
  enrolled_count: 25,
  semester: "Fall 2024",
  status: "active"
}

πŸ”§ Setup Database & Sample Data

// Create database
use student_management

// Create students collection with validation
db.createCollection("students", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["student_id", "first_name", "last_name", "email"],
      properties: {
        student_id: { bsonType: "string", pattern: "^STU[0-9]{7}$" },
        email: { bsonType: "string", pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$" },
        gpa: { bsonType: "double", minimum: 0, maximum: 4.0 }
      }
    }
  }
})

// Create indexes
db.students.createIndex({ student_id: 1 }, { unique: true })
db.students.createIndex({ email: 1 }, { unique: true })
db.students.createIndex({ "enrollment.program": 1, "enrollment.year": 1 })
db.students.createIndex({ gpa: -1 })

// Insert sample students
db.students.insertMany([
  {
    student_id: "STU2024001",
    first_name: "Alice",
    last_name: "Johnson",
    email: "alice.johnson@university.edu",
    phone: "+1-555-0123",
    date_of_birth: ISODate("2002-05-15"),
    gender: "Female",
    address: {
      street: "123 Main St",
      city: "Boston",
      state: "MA",
      zip: "02101"
    },
    enrollment: {
      date: ISODate("2024-01-15"),
      program: "Computer Science",
      year: 2,
      status: "active"
    },
    courses: [
      { course_id: "CS101", course_name: "Intro to Programming", credits: 3, grade: "A", grade_points: 4.0 },
      { course_id: "MATH201", course_name: "Calculus II", credits: 4, grade: "B+", grade_points: 3.3 }
    ],
    gpa: 3.65,
    total_credits: 45,
    created_at: ISODate()
  },
  {
    student_id: "STU2024002",
    first_name: "Bob",
    last_name: "Smith",
    email: "bob.smith@university.edu",
    phone: "+1-555-0124",
    date_of_birth: ISODate("2001-08-22"),
    gender: "Male",
    address: {
      street: "456 Oak Ave",
      city: "Boston",
      state: "MA",
      zip: "02102"
    },
    enrollment: {
      date: ISODate("2023-09-01"),
      program: "Data Science",
      year: 3,
      status: "active"
    },
    courses: [
      { course_id: "DS201", course_name: "Machine Learning", credits: 4, grade: "A", grade_points: 4.0 },
      { course_id: "STAT301", course_name: "Statistics", credits: 3, grade: "A-", grade_points: 3.7 }
    ],
    gpa: 3.85,
    total_credits: 78,
    created_at: ISODate()
  }
])

✏️ CRUD Operations

1. Create New Student

db.students.insertOne({
  student_id: "STU2024003",
  first_name: "Charlie",
  last_name: "Brown",
  email: "charlie.brown@university.edu",
  phone: "+1-555-0125",
  date_of_birth: ISODate("2003-03-10"),
  gender: "Male",
  address: {
    street: "789 Pine Rd",
    city: "Cambridge",
    state: "MA",
    zip: "02138"
  },
  enrollment: {
    date: ISODate(),
    program: "Mathematics",
    year: 1,
    status: "active"
  },
  courses: [],
  gpa: 0.0,
  total_credits: 0,
  created_at: ISODate()
})

2. Find Students

// Find by student ID
db.students.findOne({ student_id: "STU2024001" })

// Find all Computer Science students
db.students.find({ "enrollment.program": "Computer Science" })

// Find students with GPA > 3.5
db.students.find({ gpa: { $gte: 3.5 } })
  .sort({ gpa: -1 })

// Find 2nd year students
db.students.find({ "enrollment.year": 2 })

3. Update Student Information

// Update phone number
db.students.updateOne(
  { student_id: "STU2024001" },
  { $set: { phone: "+1-555-9999" } }
)

// Update address
db.students.updateOne(
  { student_id: "STU2024001" },
  { $set: { 
    "address.street": "999 New St",
    "address.city": "Cambridge"
  }}
)

// Add a new course
db.students.updateOne(
  { student_id: "STU2024001" },
  { $push: { 
    courses: {
      course_id: "CS201",
      course_name: "Data Structures",
      credits: 4,
      semester: "Spring 2025",
      grade: null,
      grade_points: null
    }
  }}
)

// Update existing course grade
db.students.updateOne(
  { student_id: "STU2024001", "courses.course_id": "CS201" },
  { $set: { 
    "courses.$.grade": "A",
    "courses.$.grade_points": 4.0
  }}
)

4. Record Attendance

// Mark student present
db.students.updateOne(
  { student_id: "STU2024001" },
  { $push: {
    attendance: {
      course_id: "CS101",
      date: ISODate(),
      status: "present"
    }
  }}
)

// Mark student absent
db.students.updateOne(
  { student_id: "STU2024002" },
  { $push: {
    attendance: {
      course_id: "DS201",
      date: ISODate(),
      status: "absent"
    }
  }}
)

5. Delete Operations

// Remove a course from student
db.students.updateOne(
  { student_id: "STU2024001" },
  { $pull: { courses: { course_id: "MATH201" } } }
)

// Delete student (soft delete - change status)
db.students.updateOne(
  { student_id: "STU2024003" },
  { $set: { "enrollment.status": "withdrawn" } }
)

// Hard delete (permanent)
db.students.deleteOne({ student_id: "STU2024003" })

πŸ” Advanced Queries

Search & Filter

// Search by name (case-insensitive)
db.students.find({ 
  first_name: { $regex: /^ali/i } 
})

// Find students in specific programs
db.students.find({ 
  "enrollment.program": { $in: ["Computer Science", "Data Science"] }
})

// Find students enrolled in a specific course
db.students.find({ 
  "courses.course_id": "CS101" 
})

// Complex query: CS students in year 2 with GPA > 3.5
db.students.find({
  "enrollment.program": "Computer Science",
  "enrollment.year": 2,
  gpa: { $gte: 3.5 }
})

Array Queries

// Find students taking more than 3 courses
db.students.find({ 
  "courses.3": { $exists: true } 
})

// Find students with all A grades
db.students.find({ 
  courses: { 
    $not: { 
      $elemMatch: { grade: { $nin: ["A", "A+"] } } 
    } 
  } 
})

// Find students who got an A in CS101
db.students.find({
  courses: {
    $elemMatch: {
      course_id: "CS101",
      grade: "A"
    }
  }
})

Date Queries

// Students enrolled this year
db.students.find({
  "enrollment.date": {
    $gte: ISODate("2024-01-01"),
    $lt: ISODate("2025-01-01")
  }
})

// Students born after 2002
db.students.find({
  date_of_birth: { $gte: ISODate("2002-01-01") }
})

πŸ“Š Analytics & Aggregations

1. Student Count by Program

db.students.aggregate([
  { $group: {
    _id: "$enrollment.program",
    count: { $sum: 1 },
    avg_gpa: { $avg: "$gpa" }
  }},
  { $sort: { count: -1 } }
])

// Output:
// { _id: "Computer Science", count: 150, avg_gpa: 3.45 }
// { _id: "Data Science", count: 120, avg_gpa: 3.52 }

2. Top Students by GPA

db.students.aggregate([
  { $match: { "enrollment.status": "active" } },
  { $sort: { gpa: -1 } },
  { $limit: 10 },
  { $project: {
    student_id: 1,
    name: { $concat: ["$first_name", " ", "$last_name"] },
    program: "$enrollment.program",
    gpa: 1,
    total_credits: 1
  }}
])

3. Course Enrollment Statistics

db.students.aggregate([
  { $unwind: "$courses" },
  { $group: {
    _id: "$courses.course_id",
    course_name: { $first: "$courses.course_name" },
    enrolled_count: { $sum: 1 },
    avg_grade_points: { $avg: "$courses.grade_points" }
  }},
  { $sort: { enrolled_count: -1 } }
])

4. Attendance Rate by Student

db.students.aggregate([
  { $unwind: "$attendance" },
  { $group: {
    _id: "$student_id",
    name: { $first: { $concat: ["$first_name", " ", "$last_name"] } },
    total_days: { $sum: 1 },
    present_days: {
      $sum: { $cond: [{ $eq: ["$attendance.status", "present"] }, 1, 0] }
    }
  }},
  { $project: {
    name: 1,
    total_days: 1,
    present_days: 1,
    attendance_rate: { 
      $multiply: [
        { $divide: ["$present_days", "$total_days"] },
        100
      ]
    }
  }},
  { $sort: { attendance_rate: -1 } }
])

5. Students at Risk (GPA < 2.5)

db.students.aggregate([
  { $match: { 
    gpa: { $lt: 2.5 },
    "enrollment.status": "active"
  }},
  { $project: {
    student_id: 1,
    name: { $concat: ["$first_name", " ", "$last_name"] },
    email: 1,
    gpa: 1,
    program: "$enrollment.program",
    year: "$enrollment.year"
  }},
  { $sort: { gpa: 1 } }
])

πŸ’» Interactive Live Console

Try these queries in the live console below. Click examples or write your own!

πŸš€ MongoDB Query Console
Output:
Ready to execute queries...

🎯 Real-World Use Cases

Use Case 1: Generate Transcript

db.students.aggregate([
  { $match: { student_id: "STU2024001" } },
  { $project: {
    student_id: 1,
    name: { $concat: ["$first_name", " ", "$last_name"] },
    program: "$enrollment.program",
    gpa: 1,
    total_credits: 1,
    courses: {
      $map: {
        input: "$courses",
        as: "course",
        in: {
          course_id: "$$course.course_id",
          name: "$$course.course_name",
          credits: "$$course.credits",
          grade: "$$course.grade"
        }
      }
    }
  }}
])

Use Case 2: Find Students for Academic Probation

db.students.find({
  gpa: { $lt: 2.0 },
  "enrollment.status": "active"
}).forEach(student => {
  print(`Alert: ${student.first_name} ${student.last_name} - GPA: ${student.gpa}`)
})

Use Case 3: Course Registration Validation

// Check if student can register (not already enrolled)
function canRegister(studentId, courseId) {
  const student = db.students.findOne({
    student_id: studentId,
    "courses.course_id": courseId
  })
  
  return student === null  // true if not enrolled
}

// Register student for course
function registerCourse(studentId, courseData) {
  return db.students.updateOne(
    { student_id: studentId },
    { $push: { courses: courseData } }
  )
}

Use Case 4: Calculate Semester GPA

db.students.aggregate([
  { $unwind: "$courses" },
  { $match: { "courses.semester": "Fall 2024" } },
  { $group: {
    _id: "$student_id",
    name: { $first: { $concat: ["$first_name", " ", "$last_name"] } },
    total_points: { 
      $sum: { $multiply: ["$courses.credits", "$courses.grade_points"] }
    },
    total_credits: { $sum: "$courses.credits" }
  }},
  { $project: {
    name: 1,
    semester_gpa: { 
      $round: [{ $divide: ["$total_points", "$total_credits"] }, 2]
    }
  }}
])