$project use to reshape each document
for the next pipeline, such as adding a new computed field or existing field from old document.
$project stage has the following prototype
form
{ $project: {
<specifications> } }
|
The $project
takes 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 the 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 a 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 the above query, it in result returns the only fName, total order fields
Adding a new field
See the following query I am adding a filed "UserType"
on the 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
}
|
No comments:
Post a Comment
Please do not enter any spam link in the comment box.