Bird
Raised Fist0
Expressframework~20 mins

Mongoose ODM setup in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Mongoose Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What happens when you connect to MongoDB with Mongoose using this code?

Consider this Express app snippet using Mongoose to connect to MongoDB:

import express from 'express';
import mongoose from 'mongoose';

const app = express();

mongoose.connect('mongodb://localhost:27017/mydb')
  .then(() => console.log('Connected to MongoDB'))
  .catch(err => console.error('Connection error:', err));

app.listen(3000, () => console.log('Server running'));

What will be printed if the MongoDB server is running and accessible?

Express
import express from 'express';
import mongoose from 'mongoose';

const app = express();

mongoose.connect('mongodb://localhost:27017/mydb')
  .then(() => console.log('Connected to MongoDB'))
  .catch(err => console.error('Connection error:', err));

app.listen(3000, () => console.log('Server running'));
AServer running only, no connection messages
BConnected to MongoDB\nServer running
CConnection error: Error: failed to connect\nServer running
DServer running\nConnected to MongoDB
Attempts:
2 left
💡 Hint

Promises run asynchronously. The server starts listening immediately, but connection success logs after connection is established.

📝 Syntax
intermediate
2:00remaining
Which Mongoose schema definition is valid for a User model with required name and optional age?

Choose the correct Mongoose schema code snippet that defines a User model with a required name (string) and an optional age (number).

Aconst userSchema = new mongoose.Schema({ name: { type: String, required: true }, age: Number });
Bconst userSchema = new mongoose.Schema({ name: String, required: true, age: Number });
Cconst userSchema = new mongoose.Schema({ name: String, age: { type: Number, required: false } });
Dconst userSchema = new mongoose.Schema({ name: { type: String }, age: { type: Number, required: true } });
Attempts:
2 left
💡 Hint

Remember that required is a property inside the field's object, not outside.

🔧 Debug
advanced
2:00remaining
Why does this Mongoose connection code cause an unhandled promise rejection?

Look at this code snippet:

mongoose.connect('mongodb://localhost:27017/mydb');

app.listen(3000, () => console.log('Server running'));

Why might this cause an unhandled promise rejection if the database is down?

Express
mongoose.connect('mongodb://localhost:27017/mydb');

app.listen(3000, () => console.log('Server running'));
ABecause app.listen must be called inside the .then() callback of mongoose.connect.
BBecause mongoose.connect requires a callback function as second argument to handle errors.
CBecause the promise returned by mongoose.connect is not handled with .then() or .catch(), so errors are unhandled.
DBecause the connection string is missing the protocol 'mongodb+srv://'.
Attempts:
2 left
💡 Hint

Promises must be handled to catch errors.

state_output
advanced
2:00remaining
What is the value of user.isNew after saving a new Mongoose document?

Given this code:

const userSchema = new mongoose.Schema({ name: String });
const User = mongoose.model('User', userSchema);

const user = new User({ name: 'Alice' });
console.log(user.isNew);
await user.save();
console.log(user.isNew);

What will be printed by the two console.log statements?

Express
const userSchema = new mongoose.Schema({ name: String });
const User = mongoose.model('User', userSchema);

const user = new User({ name: 'Alice' });
console.log(user.isNew);
await user.save();
console.log(user.isNew);
Afalse\ntrue
Btrue\nfalse
Ctrue\ntrue
Dfalse\nfalse
Attempts:
2 left
💡 Hint

isNew is true before saving and false after saving.

🧠 Conceptual
expert
2:00remaining
Which option best describes Mongoose middleware (hooks) behavior?

Mongoose supports middleware functions called hooks that run before or after certain operations.

Which statement correctly describes how pre and post hooks work in Mongoose?

APre hooks run before the operation and can modify the document; post hooks run after and receive the result or error.
BPre hooks run after the operation completes; post hooks run before the operation starts.
CPre hooks only run on queries; post hooks only run on document saves.
DMiddleware hooks in Mongoose are synchronous only and cannot handle async operations.
Attempts:
2 left
💡 Hint

Think about when you want to change data or react to results.

Practice

(1/5)
1. What is the main purpose of using mongoose.connect() in an Express app?
easy
A. To connect the Express app to a MongoDB database
B. To start the Express server
C. To define data models for the app
D. To handle HTTP requests

Solution

  1. Step 1: Understand the role of mongoose.connect()

    This function is used to establish a connection between the Express app and the MongoDB database.
  2. Step 2: Differentiate from other functions

    Starting the server or defining models are separate tasks; mongoose.connect() specifically handles database connection.
  3. Final Answer:

    To connect the Express app to a MongoDB database -> Option A
  4. Quick Check:

    mongoose.connect() = Connect DB [OK]
Hint: Remember: connect() links app to database [OK]
Common Mistakes:
  • Confusing connect() with server start
  • Thinking connect() defines models
  • Assuming connect() handles HTTP requests
2. Which of the following is the correct syntax to connect Mongoose to a MongoDB database URL stored in dbURI?
easy
A. mongoose.connect = dbURI
B. mongoose.connect(dbURI).then(() => console.log('Connected'))
C. mongoose.connect(dbURI, callback())
D. mongoose.connect(dbURI).catch(console.log('Error'))

Solution

  1. Step 1: Identify correct use of mongoose.connect()

    The method returns a promise, so chaining .then() for success is correct.
  2. Step 2: Check syntax correctness

    mongoose.connect(dbURI).then(() => console.log('Connected')) uses .then() properly; mongoose.connect = dbURI wrongly assigns connect; mongoose.connect(dbURI, callback()) uses callback incorrectly; mongoose.connect(dbURI).catch(console.log('Error')) misuses catch with console.log call.
  3. Final Answer:

    mongoose.connect(dbURI).then(() => console.log('Connected')) -> Option B
  4. Quick Check:

    Use .then() after connect() [OK]
Hint: Use .then() after connect() for success handling [OK]
Common Mistakes:
  • Assigning connect instead of calling it
  • Passing callback incorrectly
  • Calling console.log inside catch instead of passing function
3. Given this code snippet, what will be logged if the connection to MongoDB succeeds?
mongoose.connect(dbURI)
  .then(() => console.log('DB connected'))
  .catch(err => console.error('Connection error', err));
medium
A. undefined
B. Connection error
C. DB connected
D. No output

Solution

  1. Step 1: Analyze promise resolution

    If connection succeeds, the .then() callback runs, logging 'DB connected'.
  2. Step 2: Understand catch block role

    The .catch() runs only if there is an error, so it won't run here.
  3. Final Answer:

    DB connected -> Option C
  4. Quick Check:

    Success logs 'DB connected' [OK]
Hint: Success triggers .then(), error triggers .catch() [OK]
Common Mistakes:
  • Confusing .then() and .catch() roles
  • Expecting output from catch on success
  • Ignoring promise chaining
4. Identify the error in this Mongoose connection code:
mongoose.connect('mongodb://localhost:27017/mydb', () => {
  console.log('Connected to DB');
}).catch(err => console.error(err));
medium
A. console.log should be outside connect()
B. The database URL is incorrect
C. Missing await keyword before connect()
D. Using a callback inside connect() with .catch() causes an error

Solution

  1. Step 1: Understand mongoose.connect() usage

    It returns a promise; mixing callback and .catch() is incorrect and causes errors.
  2. Step 2: Identify correct pattern

    Use either callback or promise, not both together.
  3. Final Answer:

    Using a callback inside connect() with .catch() causes an error -> Option D
  4. Quick Check:

    Callback and .catch() can't be combined [OK]
Hint: Use either callback or promise, not both [OK]
Common Mistakes:
  • Mixing callbacks and promises
  • Assuming .catch() works with callbacks
  • Ignoring promise nature of connect()
5. You want to connect to MongoDB using Mongoose and log a custom message on success or failure. Which code correctly implements this with async/await inside an Express app?
hard
A. async function connectDB() { try { await mongoose.connect(dbURI); console.log('DB connected'); } catch (err) { console.error('Connection failed', err); } }
B. mongoose.connect(dbURI, () => { console.log('DB connected'); }).catch(err => console.error('Connection failed', err));
C. mongoose.connect(dbURI).then(() => { console.log('DB connected'); }).catch(console.error('Connection failed'));
D. await mongoose.connect(dbURI).then(() => console.log('DB connected')).catch(err => console.error(err));

Solution

  1. Step 1: Use async/await properly

    async function connectDB() { try { await mongoose.connect(dbURI); console.log('DB connected'); } catch (err) { console.error('Connection failed', err); } } defines an async function and uses try/catch to handle success and errors correctly.
  2. Step 2: Check other options for errors

    mongoose.connect(dbURI, () => { console.log('DB connected'); }).catch(err => console.error('Connection failed', err)); mixes callback and .catch(); mongoose.connect(dbURI).then(() => { console.log('DB connected'); }).catch(console.error('Connection failed')); calls console.error immediately; await mongoose.connect(dbURI).then(() => console.log('DB connected')).catch(err => console.error(err)); misuses await with .then() chaining.
  3. Final Answer:

    async function with try/catch and await mongoose.connect() -> Option A
  4. Quick Check:

    Async/await with try/catch is clean and correct [OK]
Hint: Use async function with try/catch for clean connection [OK]
Common Mistakes:
  • Mixing callbacks and promises
  • Calling functions immediately inside catch
  • Using await with .then() chaining