The $addFields stage is one of the stages to be used in the MongoDB Aggregation Pipeline stages. The $addFields stage allows to add new fields in the document. The generated output document contains the existing fields and new fields added using $addFields stage
Point to Consider for $addFields Stage:
- $addFields appends new fields to existing documents
- An aggregation operation can include one or more $addFields stages
- $addFields can be added to embedded documents having arrays using dot notation
- $addFields can be added to an existing array field using $concatArrays
$addFields Syntax:
{ $addFields: { <newField1>: <expression1>, <newField2>: <expression2>,... } }
Aggregation Pipeline with $addFields example
Lets consider a collection – studentMarks with the below given documents.
studentMarks
{
_id: 1,
subject: "Computer Science",
student: "Mohit Sharma",
assignment: [ 14, 17 ],
test: [ 18, 12 ],
extraCredit: 15
}
{
_id: 2,
subject: "Computer Science",
student: "Rohan Kapoor",
assignment: [ 18,16 ],
test: [ 14,16 ],
extraCredit: 14
}
We need to add 3 new $addFields as assignmentTotal , testTotal, creditTotal to be added in the output document.
db.studentMarks.aggregate( [
{
$addFields: {
assignmentTotal: { $sum: "$assignment" } ,
testTotal: { $sum: "$test" }
}
},
{
$addFields: { totalMarks:
{ $add: [ "$assignmentTotal", "$testTotal", "$extraCredit" ] } }
}
] )
The operation returns the output documents which includes the 3 new fields
{
"_id": 1,
"subject": "Computer Science",
"student": "Mohit Sharma",
"assignment": [ 14, 17 ],
"test": [ 18, 12 ],
"extraCredit": 15
"assignmentTotal" : 31,
"testTotal" : 30,
"totalMarks" : 76
}
{
"_id": 2,
"subject": "Computer Science",
"student": "Rohan Kapoor",
"assignment": [ 18,16 ],
"test": [ 14,16 ],
"extraCredit": 14,
"assignmentTotal" : 34,
"testTotal" : 30,
"totalMarks" : 78
}
Adding Fields to an Embedded Document
Embedded documents can be added with new fields using dot notation. Consider the below example for carModels with the provided fields in the document
{ _id: 1,
model: "Ford",
specs: { capacity: 5, wheels: 4 , doors:4}
}
{ _id: 2,
model: "Toyota",
specs: { capacity: 5, wheels: 2 , doors: 2 }
}
Add the new field gear into the embedded documents
db.carModels.aggregate( [
{
$addFields: {
"specs.gear": "automatic"
}
}
] )
The Aggregation operation includes the new field : gear in the output document
{ _id: 1,
model: "Ford",
specs: { capacity: 5, wheels: 4 , doors:4, gear: "automatic"}
}
{ _id: 2,
model: "Toyota",
specs: { capacity: 5, wheels: 2 , doors: 2 , gear: "automatic"}
}
Overwriting an existing field
If $addFields includes the existing field then the value provided in the $addField will replace the existing field value. Consider the below record for collection studentBranch
{ _id: 1, name: "Mohit Sharma", batch: "Computer Science" }
The $addField includes name as ‘John Smith”
db.studentBranch.aggregate( [ { $addFields: { "branch": "Java Programming" } } ] )
Then the aggregation operation changes the branch value for the student
{ _id: 1, name: "Mohit Sharma", batch: "Java Programming" }
Add $addField to an Array
$addFields allow to add new element into an Array using the $concatArrays
$concatArrays returns the concatenated array as the result
{ $concatArrays: [ <array1>, <array2>, ... ] }
consider the collection item with the below given documents
{ "_id" : 1, item: [ "icecream" ], type: [ "butterscotch", "strawberry" ] }
{ "_id" : 2, item: [ "shakes"] , type: ["apple", "banana" ] }
Add new element to type as “chocolate”
db.items.aggregate([
{ $match: { _id: 1 } },
{ $addFields: { type: { $concatArrays: [ "$type", [ "chocolate" ] ] } } }
])
The aggregation operation includes “chocolate” as type
{ "_id" : 1, item: [ "icecream" ], type: [ "butterscotch", "strawberry" , "chocolate"] }
{ "_id" : 2, item: [ "shakes"] , type: ["apple", "banana" ] }
$set stage: The $set is an alias for $addFields
{ $set: { <newField1>: <expression1>, <newField2>: <expression2>,... } }
Point to Consider for $set Stage:
- $set appends new fields to existing documents
- An aggregation operation can include one or more $set stages
- $set can be added to embedded documents having arrays using dot notation
- $set can be added to an existing array field using $concatArrays