Day 2 of 5
⏱ ~60 minutes
Express.js in 5 Days — Day 2

MongoDB and Mongoose

Connect to MongoDB Atlas, define schemas and models, and perform CRUD operations with Mongoose's query API.

Connecting to MongoDB

Terminal
npm install mongoose dotenv
.env
MONGODB_URI=mongodb+srv://user:[email protected]/mydb
db.js
const mongoose = require('mongoose');

mongoose.connect(process.env.MONGODB_URI)
  .then(() => console.log('MongoDB connected'))
  .catch(err => console.error('MongoDB error:', err));
models/User.js
const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: { type: String, required: true, trim: true },
  email: { type: String, required: true, unique: true, lowercase: true },
  role: { type: String, enum: ['user', 'admin'], default: 'user' },
  createdAt: { type: Date, default: Date.now }
});

module.exports = mongoose.model('User', userSchema);
routes/users.js
const User = require('../models/User');

// GET all users
router.get('/', async (req, res) => {
  try {
    const users = await User.find().sort('-createdAt').limit(20);
    res.json(users);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

// POST create user
router.post('/', async (req, res) => {
  try {
    const user = new User(req.body);
    await user.save();
    res.status(201).json(user);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});
📝 Day 2 Exercise
Build a User API with MongoDB
  1. C
  2. o
  3. n
  4. n
  5. e
  6. c
  7. t
  8. t
  9. o
  10. M
  11. o
  12. n
  13. g
  14. o
  15. D
  16. B
  17. A
  18. t
  19. l
  20. a
  21. s
  22. (
  23. f
  24. r
  25. e
  26. e
  27. t
  28. i
  29. e
  30. r
  31. )
  32. .
  33. D
  34. e
  35. f
  36. i
  37. n
  38. e
  39. a
  40. U
  41. s
  42. e
  43. r
  44. s
  45. c
  46. h
  47. e
  48. m
  49. a
  50. w
  51. i
  52. t
  53. h
  54. n
  55. a
  56. m
  57. e
  58. ,
  59. e
  60. m
  61. a
  62. i
  63. l
  64. ,
  65. a
  66. n
  67. d
  68. r
  69. o
  70. l
  71. e
  72. .
  73. B
  74. u
  75. i
  76. l
  77. d
  78. a
  79. l
  80. l
  81. 5
  82. C
  83. R
  84. U
  85. D
  86. r
  87. o
  88. u
  89. t
  90. e
  91. s
  92. .
  93. T
  94. e
  95. s
  96. t
  97. w
  98. i
  99. t
  100. h
  101. P
  102. o
  103. s
  104. t
  105. m
  106. a
  107. n
  108. o
  109. r
  110. c
  111. u
  112. r
  113. l
  114. .

Day 2 Summary

  • mongoose.connect(uri) — connect once at startup. All models share this connection.
  • Schemas define shape + validation. Models are the interface for querying.
  • Always use async/await with Mongoose. Wrap in try/catch for error handling.
  • Mongoose validation happens before saving. Unique index violations throw an error with code: 11000.
Finished this lesson?