Database
[{"name":"A","parent":null},{"name":"B","parent":null},{"name":"C","parent":"A"},{"name":"D","parent":"A"},{"name":"E","parent":"D"},{"name":"F","parent":"D"},{"name":"G","parent":"B"},{"name":"H","parent":"B"},]
Query
db.collection.aggregate([{$lookup:{from:"collection",let:{name:"$name"},pipeline:[{$match:{$expr:{$eq:["$parent","$$name"]}}},{$lookup:{from:"collection",let:{name:"$name"},pipeline:[{$match:{$expr:{$eq:["$parent","$$name"]}}},{$replaceRoot:{newRoot:{$arrayToObject:[[{k:"$name",v:[]}]]}}}],as:"children"}},{$replaceRoot:{newRoot:{$arrayToObject:[[{k:"$name",v:"$children"}]]}}}],as:"children"}},{$match:{children:{$ne:[]},parent:null}},{$group:{_id:"$parent",array:{$push:{array:[{k:"$name",v:"$children"}]}}}},{$addFields:{array:{$map:{input:"$array",as:"item",in:{$arrayToObject:"$$item.array"}}}}},{$replaceRoot:{newRoot:{$arrayToObject:[[{k:"null",v:"$array"}]]}}}])