Skip to main content

$redact(Aggregation) in MongoDB with example

Using $redact we can restrict the content of the document on the basis of information stored in document themselves.
For example, a collection named Inventory which has the following structure.

Run following script.


use Test



db.Inventory.insert(
{
"Title":"MongoDB Tutorial by codefari.com",
"ISBN":"1990987666765",
"AccessCountry":["India","China"],
})
db.Inventory.insert(
{
"Title":"SQL Server tutorial by codefari.com",
"ISBN":"9909876765476",
"AccessCountry":["USA"],
})
db.Inventory.insert(
{
"Title":"C# tutorial by codefari.com",
"ISBN":"8898877676544",
"AccessCountry":["UK"],
})
db.Inventory.find()


Output


/* 0 */
{
    "_id" : ObjectId("5655b294583c040b3341b96e"),
    "Title" : "MongoDB Tutorial by codefari.com",
    "ISBN" : "1990987666765",
    "AccessCountry" : [
        "India",
        "China"
    ]
}

/* 1 */
{
    "_id" : ObjectId("5655b294583c040b3341b96f"),
    "Title" : "SQL Server tutorial by codefari.com",
    "ISBN" : "9909876765476",
    "AccessCountry" : [
        "USA"
    ]
}

/* 2 */
{
    "_id" : ObjectId("5655b294583c040b3341b970"),
    "Title" : "C# tutorial by codefari.com",
    "ISBN" : "8898877676544",
    "AccessCountry" : [
        "UK"
    ]
}




See content "AccessCountry" we want to filter content on the behalf of the country means a user belong to country USA can't see the other content except "AccessCountry", "USA" at this level we can use $redact.
See below query.


var userAccess=["India","USA"];
db.Inventory.aggregate(
[{
    $redact:{
         $cond: {
           if: { $gt: [ { $size: { $setIntersection: [ "$AccessCountry", userAccess ] } }, 0 ] },
           then: "$$DESCEND",
           else: "$$PRUNE"
         }
        }
}])


Output

                                                                                                                   
/* 0 */
{
    "result" : [
        {
            "_id" : ObjectId("5655b294583c040b3341b96e"),
            "Title" : "MongoDB Tutorial by codefari.com",
            "ISBN" : "1990987666765",
            "AccessCountry" : [
                "India",
                "China"
            ]
        },
        {
            "_id" : ObjectId("5655b294583c040b3341b96f"),
            "Title" : "SQL Server tutorial by codefari.com",
            "ISBN" : "9909876765476",
            "AccessCountry" : [
                "USA"
            ]
        }
    ],
    "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…