It’s definitely possible to do what you are asking about. Starting with a single document with your array of people, here’s what it looks like:
db.people.find()
{ "_id" : 0, "myarray" : [ { "name" : "Alice", "age" : 21 }, { "name" : "Max", "age" : 20 }, { "name" : "Jane", "age" : 20 } ] }
db.people.aggregate({$project:{ ages: {$map:{
input:{$setUnion:"$myarray.age"},
as: "a",
in: {
age: "$$a",
people: { $filter:{ input:"$myarray", cond:{$eq:["$$a", "$$this.age"]}}}
}
}}}})
{ "_id" : 0, "ages" : [
{ "age" : 20, "people" : [ { "name" : "Max", "age" : 20 }, { "name" : "Jane", "age" : 20 } ] },
{ "age" : 21, "people" : [ { "name" : "Alice", "age" : 21 } ] }
] }