Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-16456

Provide aggregation operations at each group level.

    • Type: Icon: Improvement Improvement
    • Resolution: Done
    • Priority: Icon: Minor - P4 Minor - P4
    • None
    • Affects Version/s: 2.6.5, 2.8.0-rc2
    • Component/s: Aggregation Framework
    • Labels:
      None

      Suppose I have the following documents:

      db.country.insert(
      {
        "region" : "EMEA",
        "country" : "France",
        "count": 10
      }
      );
      
      db.country.insert(
      {
        "region" : "EMEA",
        "country" : "Germany",
        "count": 30
      }
      );
      
      db.country.insert(
      {
        "region" : "AMERICAS",
        "country" : "USA",
        "count": 15
      }
      );
      
      db.country.insert(
      {
        "region" : "AMERICAS",
        "country" : "Canada",
        "count": 20
      }
      );
      

      I want to get the following stats out of this database:

      • Number of document per regions, per country
      • sum (or avg...) of the "count" for each region and country

      AFAIK in MongoDB I need to use 2 aggregate calls:

      // for Region
      db.country.aggregate([
       { $group : { _id : "$region", doc_count : {$sum : 1} , total : { $sum : "$count" } } }
      ]);
      

      result:

      { "_id" : "AMERICAS", "doc_count" : 2, "total" : 35 }
      { "_id" : "EMEA", "doc_count" : 2, "total" : 40 }
      

      // For country inside a region

      db.country.aggregate([
       { $group : { _id : { region : "$region" , country : "$country"  }, doc_count : {$sum : 1} , total : { $sum : "$count" } } }
      ]);
      

      result:

      { "_id" : { "region" : "AMERICAS", "country" : "USA" }, "doc_count" : 1, "total" : 15 }
      { "_id" : { "region" : "AMERICAS", "country" : "Canada" }, "doc_count" : 1, "total" : 20 }
      { "_id" : { "region" : "EMEA", "country" : "Germany" }, "doc_count" : 1, "total" : 30 }
      { "_id" : { "region" : "EMEA", "country" : "France" }, "doc_count" : 1, "total" : 10 }
      

      >> May be it is possible to do it with some "hacks" in the aggregation pipeline, but I have not found it yet.

      It would be useful to group by firs level and have an option to create sub document for each sub element. To be honest I do not have think through the full process (developer experience, result, limitations)

      This feature will make the life easier to developers to create dashboard for example

            Assignee:
            Unassigned Unassigned
            Reporter:
            tugdual.grall Tugdual Grall
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: