Search code examples
mongodbgomgo

How to count total number of records inside data using $group aggregation


I am trying to perform a query using golang mgo package to effectively get similar values from a $group aggregation and count the total record value.But I am not able to get total record count for grouped data. My structure is like this:

{

    "data": [
        {
            "_id": 366,

            "logs": [
                {
                    "id": 113,
                    "booking_id": 366,
                    "provider_id": 13,
                    "cid": 11,
                    "type": "basic",
                    "time": 1542793756,
                },
                {
                    "id": 116,
                    "booking_id": 366,
                    "provider_id": 13,
                    "cid": 0,
                    "type": "type2",
                }


            ]
        },
        {
            "_id": 362,

            "logs": [
                {
                    "id": 104,
                    "booking_id": 362,
                    "provider_id": 7,
                    "cid": 10,
                    "type": "basic",
                    "time": 1542776677,
                }
            ]
        },

        {
            "_id": 370,

            "logs": [
                {
                    "id": 111,
                    "booking_id": 370,
                    "provider_id": 9,
                    "cid": 11,
                    "type": "basic",
                    "time": 1542792661,
                },
                {
                    "id": 112,
                    "booking_id": 370,
                    "provider_id": 11,
                    "cid": 11,
                    "type": "basic",
                    "time": 1542793185,
                }
            ]
       }

    ],
     "total_record": 2
   }

For this I want total record preset inside data::

"total_record":3 

Query I am using ::

query := []bson.M{
        {"$group": bson.M{
        "_id":  "$booking_id",
        "logs": bson.M{ "$push": "$$ROOT" }
        "count": bson.M{"$sum":1},
        }},
    }

    pipe := getCollection.Pipe(query)
    err = pipe.AllowDiskUse().One(&result)

I want total count of this result. Log section having data with duplicate bookings with the different "provider_id" values but I have grouped all similar booking_id data in single document and show it's count. Is is possible with $group aggregation?


Solution

  • You can use $count aggregation to find total record inside data, link

    To calculate total count of grouped data, you can use $count aggregation after grouping data. Your Query should be like this if you want total count data::

    query := []bson.M{
            {"$group": bson.M{
            "_id":  "$booking_id",
            }},
            {"$count" : "count"},
        }
    
        pipe := getCollection.Pipe(query)
        err = pipe.AllowDiskUse().One(&result)
    

    To calculate records inside each "logs" you can use query as follows::

    query := []bson.M{
            {"$group": bson.M{
            "_id":  "$booking_id",
            "logs": bson.M{ "$push": "$$ROOT" },
            "count": bson.M{"$sum":1},
            }},
        }
    
        pipe := getCollection.Pipe(query)
        err = pipe.AllowDiskUse().One(&result)