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]
}
}}
])