Search code examples
mongodbmongodb-queryaggregation-frameworkmongodb-aggregation

How to use Mongo aggregate feature to compute Totals and SubTotal Percentages with Nested Groups?


I have some documents in mongo collection like this.

 {
    "_id" : ObjectId("57e290087139be15d59408c1"),
    "groupName" : "Registration",
    "testCases" : [ 
        {
            "name" : "R1",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "R1.1",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "R2",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "R3",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "R4",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "R1",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "R2",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "R3",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "R4",
            "browser" : "Firefox",
            "status" : "failed"
        }
    ]
}

    {
    "_id" : ObjectId("57e2903b7139be15d59408c2"),
    "groupName" : "Checkout",
    "testCases" : [ 
        {
            "name" : "C1",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "C2",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "C3",
            "browser" : "Chrome",
            "status" : "failed"
        }, 
        {
            "name" : "C4",
            "browser" : "Chrome",
            "status" : "passed"
        }, 
        {
            "name" : "C1",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "C2",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "C3",
            "browser" : "Firefox",
            "status" : "passed"
        }, 
        {
            "name" : "C4",
            "browser" : "Firefox",
            "status" : "failed"
        }
    ]
}

How do I use Mongo's aggregate feature to compute totals and subtotal percentages with nested groups?

I am expecting an output with results as

Example Expected Output:

results: [    
    {
        "groupName": "Registration",
        "totalTests": 17,
        "section": [
            { "name": "R1", "totalTests": 17, "sectionCount": 2 }
        ]
    }
]

Solution

  • You can try running the following aggregation operation:

    db.collection.aggregate([
        { "$unwind": "$testCases" },
        {
            "$group": {
                "_id": null,
                "testsCount": { "$sum": 1 },
                "docs": { "$push": "$$ROOT" }
            }
        },
        { "$unwind": "$docs" },
        {
            "$group": {
                "_id": {
                    "groupName": "$docs.groupName",
                    "testName": "$docs.testCases.name"
                },
                "count": { "$sum": 1 },
                "testsCount": { "$first": "$testsCount" }
            }
        },    
        {
            "$group": {
                "_id": "$_id.groupName",
                "totalTests": { "$first": "$testsCount" },
                "section": {
                    "$push": {
                        "name": "$_id.testName", 
                        "totalTests": "$testsCount", 
                        "sectionCount": "$count"
                    }
                }
            }
        }
    ])