Bird
Raised Fist0
MongoDBquery~3 mins

Why $replaceRoot for restructuring in MongoDB? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could instantly turn hidden details into the main story with one simple step?

The Scenario

Imagine you have a messy box full of different toys mixed together. To play with just the cars, you have to dig through everything every time.

The Problem

Manually sorting through all the toys each time is slow and tiring. You might miss some cars or get frustrated searching every time you want to play.

The Solution

$replaceRoot helps you take just the part you want from each item and make it the main focus. It's like pulling out only the cars and putting them in a separate box ready to play.

Before vs After
✗ Before
db.collection.find().forEach(doc => printjson(doc.details))
✓ After
db.collection.aggregate([{ $replaceRoot: { newRoot: "$details" } }])
What It Enables

This lets you reshape your data easily, focusing only on the parts you need for faster and cleaner queries.

Real Life Example

In a customer database, if each record has a nested address object, $replaceRoot lets you pull out just the address to work with it directly, like mailing labels.

Key Takeaways

Manually extracting nested data is slow and error-prone.

$replaceRoot makes nested data the main data instantly.

It simplifies queries and improves data handling.

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