How to group an array using reduce, without unwind+group?

@Takis

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 } ] } 
   ] }
1 Like