Skip to main content

$project in MongoDB with example

$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 $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 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
}


Popular posts from this blog

Remove special character from string in MongoDB

Problem: Suppose wehave a collection and one field is type string contains some special character (like !@#$%) and we don’t want these special character.
Solution: We can easily remove the special character from field using script “replace(/[^a-zA-Z 0-9 ]/g, '')” in our query.  How can we remove special character from string using this script please see following example.
Example: Suppose we have a collection “EduSurvey “where we are collecting information from institutions.

{Name:"JB institute”, About:"This is good one collage for MBA", Information:"This $%%institute ##has good faculty etc$$"}
{Name:"MK institute”, About:"This is good one collage for MCA", Information:"This$$%# is the dummy text12"}
{Name:"MG institute”, About:"This is good one collage for B,Tech", Information:"This# institute@ has&* good infrastructure"}

Did you notice Information fields contains some special character so we…

Add day to ISODate in MongoDB

We can use $add operator to add days in ISODate in mongodb, $add is the Arithmetic Aggregation Operator which adds number and date in mongodb.
Syntax:

{ $add: [ <expression1>, <expression2>, ... ] }

Note:  If one of the argument is date $add operator treats to other arguments as milliseconds to add to the date.
Example: Suppose we have a Test collection as below.

{"Title" : "Add day to ISODate in MongoBD","CreatedDate" : ISODate("2016-07-07T08:00:00.000Z")}

Query to add 2 days in CreatedDate

db.Test.aggregate([      { $project: { Title: 1, AddedDate: { $add: [ "$CreatedDate", 2*24*60*60000 ] } } }    ])

Result:

{ "_id" : ObjectId("579a1567ac1b3f3732483de0"), "Title" : "Add day to ISODate in MongoBD", "AddedDate" : ISODate("2016-07-09T08:00:00.000Z") }

Note: As mentioned in above note we have to convert days in millisecond because $add operator treat to other arg…