$project in MongoDB with example

$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

PostgreSQL: How to change the password of the user

This article will teach you to change the password of the user in PostgreSQL. To change the password, we use the ALTER ROLE, its uses are ...