Search code examples
mongodbmongodb-queryspring-dataaggregation-framework

How to find Distinct No of Document on specific field MongoDB and Implement in Java


I have data and need to group by two fields and in response display unique filed along with the count on this field.

Sample data:

[
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_id": "A"
   },
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_id": "B"
   },
   {
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_id": "C"
   }
]

Expected Output:

[
   {
      "categoryCode":"categoryCode1",
      "categoryName":"categoryName1",
      "cat_count": 2
   },
   {
      "categoryCode":"categoryCode2",
      "categoryName":"categoryName2",
      "cat_count": 1
   }
]

and how to implement it in Java with Aggregation Object.

GroupOperation groupOperation = Aggregation.group("categoryCode", "categoryName").sum(1).as("cat_count"); 

but getting compile error:

1 is not taken inside sum method


Solution

    1. $group - Group by categoryCode and categoryName. And add aggregate field cat_count for $sum when match with group.
    2. $project - Display document for desired output field.
    db.collection.aggregate([
      {
        $group: {
          _id: {
            "categoryCode": "$categoryCode",
            "categoryName": "$categoryName"
          },
          "cat_count": {
            $sum: 1
          }
        }
      },
      {
        $project: {
          "_id": 0,
          "categoryCode": "$_id.categoryCode",
          "categoryName": "$_id.categoryName",
          "cat_count": "$cat_count"
        }
      }
    ])
    

    Sample Mongo Playground