Database
db={"account":[{_id:21,email:"first.uno@gmail.com",firstName:"First",lastName:"Uno"},{_id:22,email:"second.dos@yahoo.com",firstName:"Second",lastName:"Dos"},{_id:23,email:"third.tres@hotmail.com",firstName:"Third",lastName:"Tres"}],"review":[{lawyerId:3,userId:21,message:"Message meh",rate:3,createdAt:ISODate("2015-02-28T00:00:00Z")},{lawyerId:3,userId:22,message:"Message blah",rate:4,createdAt:ISODate("2015-02-28T00:00:00Z")},{lawyerId:3,userId:21,message:"Message foo",rate:4,createdAt:ISODate("2015-02-28T00:00:00Z")},{lawyerId:3,userId:23,message:"Message bar",rate:2,createdAt:ISODate("2015-02-28T00:00:00Z")}]}
Query
db.review.aggregate([{$match:{lawyerId:3}},{$lookup:{from:"account",localField:"userId",foreignField:"_id",as:"user"}},{$unwind:"$user"},{$group:{_id:"$lawyerId",averageRate:{$avg:"$rate"},reviews:{$push:{createdAt:"$createdAt",firstName:"$user.firstName",lastName:"$user.lastName",message:"$message",rate:"$rate"}}}},{$project:{_id:0,averageRate:1,reviews:1}}])