Database

[{"id":80,"Category":"1","sub_category":null},{"id":81,"Category":"1.1","sub_category":80},{"id":82,"Category":"1.1.1","sub_category":81},{"id":83,"Category":"1.2","sub_category":80},{"id":84,"Category":"1.1.1.1","sub_category":82}]

Query

db.collection.aggregate([{$match:{sub_category:null}},{$graphLookup:{from:"collection",startWith:"$id",connectFromField:"id",connectToField:"sub_category",depthField:"level",as:"SubCategories"}},{$unwind:{path:"$SubCategories",preserveNullAndEmptyArrays:true}},{$sort:{"SubCategories.level":-1}},{$group:{_id:"$id",sub_category:{$first:"$sub_category"},Category:{$first:"$Category"},SubCategories:{$push:"$SubCategories"}}},{$addFields:{SubCategories:{$reduce:{input:"$SubCategories",initialValue:{level:-1,presentChild:[],prevChild:[]},in:{$let:{vars:{prev:{$cond:[{$eq:["$$value.level","$$this.level"]},"$$value.prevChild","$$value.presentChild"]},current:{$cond:[{$eq:["$$value.level","$$this.level"]},"$$value.presentChild",[]]}},in:{level:"$$this.level",prevChild:"$$prev",presentChild:{$concatArrays:["$$current",[{$mergeObjects:["$$this",{SubCategories:{$filter:{input:"$$prev",as:"e",cond:{$eq:["$$e.sub_category","$$this.id"]}}}}]}]]}}}}}}}},{$addFields:{SubCategories:"$SubCategories.presentChild"}}])

Result