What if you could instantly show only the exact data you want, without digging through the noise?
Why $project stage for shaping output in MongoDB? - Purpose & Use Cases
Imagine you have a huge box of mixed toys, and you want to show only the red cars to your friend. You try sorting through the box by hand, picking out each red car one by one.
Sorting toys manually is slow and tiring. You might miss some red cars or accidentally grab other toys. It's hard to keep track and easy to make mistakes.
The $project stage in MongoDB lets you quickly pick and shape exactly the parts of your data you want, like showing only red cars from the box without digging through everything yourself.
for toy in toys: if toy.color == 'red' and toy.type == 'car': print(toy)
db.toys.aggregate([
{ $project: { redCars: { $cond: [{ $and: [{ $eq: ["$color", "red"] }, { $eq: ["$type", "car"] }] }, "$$ROOT", null] } } }
])It lets you quickly reshape and filter your data output to show exactly what matters, making your queries faster and your results clearer.
A store wants to show customers only the product names and prices, hiding all other details like supplier info or stock numbers. Using $project, they create a clean, simple list for the website.
Manually picking data is slow and error-prone.
$project shapes and filters data output easily.
It helps create clear, focused results for any need.
Practice
$project stage do in a MongoDB aggregation pipeline?Solution
Step 1: Understand the purpose of
The$project$projectstage is used to control which fields appear in the output documents and how they are shaped.Step 2: Compare with other stages
Filtering is done by$match, sorting by$sort, and grouping by$group. So$projectis for shaping output fields.Final Answer:
It shapes the output by selecting, renaming, or creating fields. -> Option BQuick Check:
$projectshapes output = A [OK]
- Confusing $project with $match for filtering
- Thinking $project sorts documents
- Mixing $project with $group for aggregation
name and age fields in the output using $project?Solution
Step 1: Recall
To include fields, set them to 1. To exclude, set to 0. Boolean or strings are invalid.$projectsyntax for inclusionStep 2: Check each option
{ $project: { name: 1, age: 1 } } uses 1 for inclusion correctly. { $project: { name: 0, age: 0 } } excludes fields. { $project: { name: true, age: true } } uses true which is invalid. { $project: { name: 'include', age: 'include' } } uses strings which is invalid.Final Answer:
{ $project: { name: 1, age: 1 } } -> Option AQuick Check:
Include fields = 1 in $project [OK]
- Using true/false instead of 1/0
- Mixing inclusion and exclusion in same $project
- Using strings instead of numbers for field selection
{ "name": "Alice", "age": 25, "city": "NY" }What will be the output of this aggregation?
[{ $project: { fullName: "$name", ageInMonths: { $multiply: ["$age", 12] }, _id: 0 } }]Solution
Step 1: Understand field renaming and calculation
ThefullNamefield is created by copyingname. TheageInMonthsis calculated by multiplyingageby 12 (25*12=300). The_idis excluded.Step 2: Check output fields
Output hasfullNamewith "Alice" andageInMonthswith 300. Nonameoragefields remain.Final Answer:
[{ "fullName": "Alice", "ageInMonths": 300 }] -> Option DQuick Check:
Rename + multiply age = output [OK]
- Expecting original fields to remain without including them
- Confusing field names after renaming
- Forgetting to exclude _id if not wanted
$project stage:{ $project: { fullName: "$name", ageInMonths: { $multiply: ["age", 12] }, _id: 0 } }Solution
Step 1: Check field references in expressions
In MongoDB aggregation, to reference a field inside expressions, prefix with$. Here, "age" is missing$.Step 2: Validate other parts
$multiplyis valid in$project. Excluding_idis allowed. Renaming fields is allowed.Final Answer:
Field name "age" should be prefixed with $ to reference the field. -> Option CQuick Check:
Field references need $ prefix [OK]
- Omitting $ before field names in expressions
- Thinking $multiply is invalid in $project
- Believing _id cannot be excluded
firstName, lastName, and birthYear. Write a $project stage that outputs fullName as concatenation of first and last names separated by a space, and age calculated as 2024 minus birthYear. Which is the correct stage?Solution
Step 1: Build fullName using $concat with spaces
Use$concatwith"$firstName", a space string, and"$lastName"to join names with a space.Step 2: Calculate age using $subtract
SubtractbirthYearfield from 2024 using$subtract. Field references need$.Step 3: Check each option
{ $project: { fullName: { $concat: ["$firstName", " ", "$lastName"] }, age: { $subtract: [2024, "$birthYear"] }, _id: 0 } } correctly uses$concatwith space and$subtractwith field references. { $project: { fullName: "$firstName $lastName", age: 2024 - "$birthYear", _id: 0 } } uses invalid string concatenation and arithmetic. { $project: { fullName: { $concat: ["firstName", " ", "lastName"] }, age: { $subtract: [2024, "birthYear"] }, _id: 0 } } misses$on fields. { $project: { fullName: { $concat: ["$firstName", "$lastName"] }, age: { $subtract: ["birthYear", 2024] }, _id: 0 } } misses space and reverses subtraction.Final Answer:
{ $project: { fullName: { $concat: ["$firstName", " ", "$lastName"] }, age: { $subtract: [2024, "$birthYear"] }, _id: 0 } } -> Option AQuick Check:
Use $concat with space and $subtract with $field [OK]
- Forgetting $ before field names
- Concatenating fields without spaces
- Subtracting in wrong order
- Using string expressions instead of operators
Ready to prove it?
Pass the test and this pattern moves unknown
