$project use to reshape the each document for the next pipeline such as adding new field remove existing field.
$project stage has following prototype form
{ $project: { <specifications> } } |
The $projecttakes a document that can specify the inclusion of fields, the suppression of the _id field, the addition of new fields, and the resetting the values of existing fields. The specifications have the following forms:
Syntax | Description |
<Field>:<1 or true> | Specify the inclusion of field. |
_id:<1 or true> | Specify the suppression of _id field. |
<field>: <expression> | Add a new field or reset the value of an existing field. |
For example I am creating an User Collection into Test database. See below scripts
Use Test |
db.Users.insert( { "fName" : "Dilip", "lName" : "Singh", "address" : "Noida", "totalOrder" : 150, "createdDate" : "2014/07/07" }) db.Users.insert( { "fName" : "Vipul", "lName" : "Bhatt", "address" : "Delhi", "totalOrder" : 50, "createdDate" : "2013/07/07" }) db.Users.insert( { "fName" : "Brijesh", "lName" : "Kumar", "address" : "Gorakhpur", "totalOrder" : 70, "createdDate" : "2012/07/07" }) db.Users.insert( { "fName" : "Raj", "lName" : "Kumar", "address" : "Bokaro", "totalOrder" : 40, "createdDate" : "2010/07/07" }) db.Users.find() |
it will returns following result.
/* 0 */ { "_id" : ObjectId("55dac0b31c949abf34d5daed"), "fName" : "Dilip", "lName" : "Singh", "address" : "Noida", "totalOrder" : 150, "createdDate" : "2014/07/07" } /* 1 */ { "_id" : ObjectId("55dac0c21c949abf34d5daf1"), "fName" : "Vipul", "lName" : "Bhatt", "address" : "Delhi", "totalOrder" : 50, "createdDate" : "2013/07/07" } /* 2 */ { "_id" : ObjectId("55dac0d11c949abf34d5daf2"), "fName" : "Brijesh", "lName" : "Kumar", "address" : "Gorakhpur", "totalOrder" : 70, "createdDate" : "2012/07/07" } /* 3 */ { "_id" : ObjectId("55dac0e31c949abf34d5daf3"), "fName" : "Raj", "lName" : "Kumar", "address" : "Bokaro", "totalOrder" : 40, "createdDate" : "2010/07/07" } |
Remove unnecessary fields
Now I want to apply $project on document to remove some fields
db.Users.aggregate([{ $project :{fName:1,totalOrder:1}}]) |
output result
/* 0 */ { "result" : [ { "_id" : ObjectId("55dac0b31c949abf34d5daed"), "fName" : "Dilip", "totalOrder" : 150 }, { "_id" : ObjectId("55dac0c21c949abf34d5daf1"), "fName" : "Vipul", "totalOrder" : 50 }, { "_id" : ObjectId("55dac0d11c949abf34d5daf2"), "fName" : "Brijesh", "totalOrder" : 70 }, { "_id" : ObjectId("55dac0e31c949abf34d5daf3"), "fName" : "Raj", "totalOrder" : 40 } ], "ok" : 1 } |
In above query it in result returns only fName, totalOrder fields
Adding a new field
See following query I am adding a filed "UserType" on condition if totalOrder>100 then "Gold" else "silver"
db.Users.aggregate( [{ $project : { fName:1, totalOrder:1, UserType:{ $cond:{ if:{$gte:["$totalOrder",100]}, then:"gold", else:"Silver" } } } }]) |
output
/* 0 */ { "result" : [ { "_id" : ObjectId("55dac0b31c949abf34d5daed"), "fName" : "Dilip", "totalOrder" : 150, "UserType" : "gold" }, { "_id" : ObjectId("55dac0c21c949abf34d5daf1"), "fName" : "Vipul", "totalOrder" : 50, "UserType" : "Silver" }, { "_id" : ObjectId("55dac0d11c949abf34d5daf2"), "fName" : "Brijesh", "totalOrder" : 70, "UserType" : "Silver" }, { "_id" : ObjectId("55dac0e31c949abf34d5daf3"), "fName" : "Raj", "totalOrder" : 40, "UserType" : "Silver" } ], "ok" : 1 } |
Here we added a new field "UserType".
Suppress _id using $project
See following query to usppress _id from pipeline. _id:0
db.Users.aggregate( [{ $project : { _id:0, fName:1, totalOrder:1 } }]) |
output
/* 0 */ { "result" : [ { "fName" : "Dilip", "totalOrder" : 150 }, { "fName" : "Vipul", "totalOrder" : 50 }, { "fName" : "Brijesh", "totalOrder" : 70 }, { "fName" : "Raj", "totalOrder" : 40 } ], "ok" : 1 } |