Bird
Raised Fist0
MongoDBquery~20 mins

$replaceRoot for restructuring in MongoDB - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
MongoDB $replaceRoot Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
What is the output of this $replaceRoot aggregation?
Given the collection documents:
{ "_id": 1, "user": { "name": "Alice", "age": 30 }, "score": 85 }

What will be the output of this aggregation?
[{ $replaceRoot: { newRoot: "$user" } }]
MongoDB
[{ $replaceRoot: { newRoot: "$user" } }]
A[{ "name": "Alice", "age": 30 }]
B[{ "user": { "name": "Alice", "age": 30 }, "score": 85 }]
C[{ "_id": 1, "name": "Alice", "age": 30 }]
D[{ "name": "Alice", "age": 30, "score": 85 }]
Attempts:
2 left
💡 Hint
Think about what $replaceRoot does with the specified newRoot field.
❓ query_result
intermediate
2:00remaining
What does this $replaceRoot pipeline produce?
Given documents:
{ "_id": 2, "order": { "id": 101, "items": 3 }, "status": "shipped" }

Run this pipeline:
[{ $replaceRoot: { newRoot: { $mergeObjects: ["$order", { "status": "$status" }] } } }]
MongoDB
[{ $replaceRoot: { newRoot: { $mergeObjects: ["$order", { "status": "$status" }] } } }]
A[{ "id": 101, "items": 3, "status": "shipped" }]
B[{ "order": { "id": 101, "items": 3 }, "status": "shipped" }]
C[{ "id": 101, "items": 3 }]
D[{ "status": "shipped" }]
Attempts:
2 left
💡 Hint
Look at how $mergeObjects combines fields from two documents.
📝 Syntax
advanced
2:00remaining
Which $replaceRoot usage is syntactically correct?
Choose the option with correct syntax for $replaceRoot stage in MongoDB aggregation.
A{ $replaceRoot: "$details" }
B{ $replaceRoot: { root: "$details" } }
C{ $replaceRoot: { newRoot: details } }
D{ $replaceRoot: { newRoot: "$details" } }
Attempts:
2 left
💡 Hint
Check the exact field name and value type required by $replaceRoot.
❓ optimization
advanced
2:00remaining
How to optimize restructuring with $replaceRoot and $project?
You want to restructure documents by replacing the root with the 'profile' field but also keep the original '_id'. Which pipeline is best?
A[{ $replaceRoot: { newRoot: "$profile" } }, { $project: { _id: 1 } }]
B[{ $replaceRoot: { newRoot: { $mergeObjects: ["$profile", { _id: "$_id" }] } } }]
C[{ $replaceRoot: { newRoot: "$profile" } }, { $addFields: { _id: "$_id" } }]
D[{ $project: { _id: 1, profile: 1 } }, { $replaceRoot: { newRoot: "$profile" } }]
Attempts:
2 left
💡 Hint
Consider how to keep _id while replacing root in one step.
🧠 Conceptual
expert
2:00remaining
What error occurs if $replaceRoot newRoot field is missing?
Consider this aggregation stage:
{ $replaceRoot: { } }

What error will MongoDB raise when running this?
ATypeError: Cannot read property 'newRoot' of undefined
BSyntaxError: Unexpected end of stage specification
CMongoError: 'newRoot' is required for $replaceRoot stage
DNo error, pipeline runs but documents are unchanged
Attempts:
2 left
💡 Hint
Think about required fields for $replaceRoot stage.

Practice

(1/5)
1. What does the $replaceRoot stage do in a MongoDB aggregation pipeline?
easy
A. It groups documents by a specified key.
B. It filters documents based on a condition.
C. It replaces the entire document with the specified embedded document.
D. It sorts documents by a specified field.

Solution

  1. Step 1: Understand the purpose of $replaceRoot

    $replaceRoot replaces the whole document with a specified nested document inside it.
  2. Step 2: Compare with other stages

    Filtering, sorting, and grouping are done by $match, $sort, and $group respectively, not $replaceRoot.
  3. Final Answer:

    It replaces the entire document with the specified embedded document. -> Option C
  4. Quick Check:

    $replaceRoot changes document root [OK]
Hint: Remember: $replaceRoot swaps the whole document root [OK]
Common Mistakes:
  • Confusing $replaceRoot with filtering or sorting stages
  • Thinking it only modifies part of the document
  • Assuming it adds fields instead of replacing
2. Which of the following is the correct syntax to use $replaceRoot to replace the root with the details field?
easy
A. { $replaceRoot: { newRoot: "$details" } }
B. { $replaceRoot: { root: "$details" } }
C. { $replaceRoot: { newRoot: details } }
D. { $replaceRoot: { newRoot: "$details" }, $match: {} }

Solution

  1. Step 1: Recall correct $replaceRoot syntax

    The correct syntax requires newRoot with a string path starting with "$" to specify the field.
  2. Step 2: Analyze options

    { $replaceRoot: { newRoot: "$details" } } uses newRoot: "$details" which is correct. { $replaceRoot: { root: "$details" } } uses wrong key root. { $replaceRoot: { newRoot: details } } misses quotes around field path. { $replaceRoot: { newRoot: "$details" }, $match: {} } adds an unrelated $match inside the same stage, which is invalid.
  3. Final Answer:

    { $replaceRoot: { newRoot: "$details" } } -> Option A
  4. Quick Check:

    Use newRoot: "$field" syntax [OK]
Hint: Use newRoot: "$fieldName" exactly [OK]
Common Mistakes:
  • Omitting quotes around field path
  • Using wrong key like 'root' instead of 'newRoot'
  • Combining stages incorrectly
3. Given the collection documents:
{ "name": "Alice", "info": { "age": 30, "city": "NY" } }

What will be the output of this aggregation?
[{ $replaceRoot: { newRoot: "$info" } }]
medium
A. [{ "name": "Alice", "info": { "age": 30, "city": "NY" } }]
B. [{ "age": 30, "city": "NY" }]
C. [{ "info": { "age": 30, "city": "NY" } }]
D. [{ "age": 30 }]

Solution

  1. Step 1: Understand $replaceRoot effect

    The stage replaces the whole document with the content of the info field.
  2. Step 2: Apply to given document

    Original document has info as { "age": 30, "city": "NY" }, so output document is exactly that object.
  3. Final Answer:

    [{ "age": 30, "city": "NY" }] -> Option B
  4. Quick Check:

    Root replaced by info field content [OK]
Hint: Output matches the nested field content exactly [OK]
Common Mistakes:
  • Expecting original fields to remain
  • Confusing nested field with root
  • Selecting wrong output format
4. You wrote this aggregation but it throws an error:
[{ $replaceRoot: { newRoot: info } }]

What is the error and how to fix it?
medium
A. Missing quotes around field path; fix with newRoot: "$info".
B. Wrong operator; use $setRoot instead of $replaceRoot.
C. Field info does not exist; add it first.
D. Aggregation pipeline must be an object, not an array.

Solution

  1. Step 1: Identify syntax error in newRoot value

    The field path must be a string starting with "$" to indicate a field reference.
  2. Step 2: Correct the syntax

    Change newRoot: info to newRoot: "$info" to fix the error.
  3. Final Answer:

    Missing quotes around field path; fix with newRoot: "$info". -> Option A
  4. Quick Check:

    Field paths need quotes and $ prefix [OK]
Hint: Always quote field paths with $ prefix [OK]
Common Mistakes:
  • Omitting quotes around field names
  • Confusing $replaceRoot with $setRoot
  • Misunderstanding pipeline array structure
5. You have documents:
{ "user": { "id": 1, "name": "Bob" }, "score": 50 }

How do you write an aggregation pipeline using $replaceRoot to make the output documents only contain the user fields plus the score field at the root level?
hard
A. [{ $replaceRoot: { newRoot: "$score" } }]
B. [{ $replaceRoot: { newRoot: "$user" } }, { $addFields: { score: "$score" } }]
C. [{ $project: { user: 1, score: 1 } }]
D. [{ $replaceRoot: { newRoot: { $mergeObjects: ["$user", { score: "$score" }] } } }]

Solution

  1. Step 1: Understand the goal

    We want to flatten user fields to root and keep score alongside.
  2. Step 2: Use $mergeObjects inside $replaceRoot

    $mergeObjects combines user object and { score: "$score" } into one root document.
  3. Step 3: Check options

    [{ $replaceRoot: { newRoot: { $mergeObjects: ["$user", { score: "$score" }] } } }] correctly merges and replaces root. [{ $replaceRoot: { newRoot: "$user" } }, { $addFields: { score: "$score" } }] tries to add fields after replacing root, but score is lost after first stage. [{ $project: { user: 1, score: 1 } }] only projects fields, not restructuring. [{ $replaceRoot: { newRoot: "$score" } }] replaces root with score only, losing user.
  4. Final Answer:

    [{ $replaceRoot: { newRoot: { $mergeObjects: ["$user", { score: "$score" }] } } }] -> Option D
  5. Quick Check:

    Use $mergeObjects to combine fields [OK]
Hint: Combine objects with $mergeObjects inside $replaceRoot [OK]
Common Mistakes:
  • Replacing root with only one field losing others
  • Trying to add fields after $replaceRoot without preserving data
  • Using $project instead of restructuring
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard