Search code examples
mongodbsetgroupingaggregation

How would I make grouped lists through querying using MongoDB aggregation?


Say that I have an attribute with something like letter grades of a student, using a structure like:

Students
{
    "_id": {
        "$oid": string
    },
    "student_id": int,
    "grades": string,
    "student_name": string,
...
}

and I want to go through the database and group the students by storing them in sets based on each letter grade (assuming that each student has a unique name) like: A+ : [Chris, Ada, Lee], A- : [John, Lisa], … How would I structure the query through using something like $addToSet (hopefully without having to manually type each letter grade)?

I've tried $group-ing the students with grades and using $match to try and iterate through the list of grades, but I haven't come across any errorless ways of creating sets without just getting an integer count of how many students have that grade (ex. 7 students have grade of A+. But who are the students?).


Solution

  • If I understand what you are trying to do, here's one way to "$group" by "grades" and get an array of all "student_name" with that grade.

    db.Students.aggregate([
      {
        "$group": {
          "_id": "$grades",
          "names": {"$push": "$student_name"},
          "count": {"$count": {}}
        }
      }
    ])
    

    Try it on mongoplayground.net.