Database

[{"_id":1,"data":"...","similar_id":[2,3,4]},{"_id":2,"data":"...","similar_id":[1]},{"_id":3,"data":"...","similar_id":[1,4]},{"_id":4,"data":"...","similar_id":[1,3]},{"_id":7,"data":"...","similar_id":[]},{"_id":5,"data":"...","similar_id":[6]},{"_id":6,"data":"...","similar_id":[5]},]

Query

db.collection.aggregate([{$unwind:{path:"$similar_id",preserveNullAndEmptyArrays:true}},{$addFields:{similar_id:{$ifNull:["$similar_id","$_id"]}}},{$sort:{_id:1,similar_id:-1}},{$addFields:{tmpId:{$cond:[{$gt:["$similar_id","$_id"]},["$_id","$similar_id"],["$similar_id","$_id"]]}}},{$group:{_id:"$tmpId",sum:{$sum:1}}},{$facet:{single:[{$match:{sum:1}},{$unwind:"$_id"},{$group:{_id:null,potentionals:{$addToSet:"$_id"}}}],clusters:[{$match:{sum:2}},{$group:{_id:null,edges:{$addToSet:"$_id"},}},{$project:{all:{$reduce:{input:"$edges",initialValue:[],in:{$setUnion:["$$this","$$value"]}}},groups:{$reduce:{input:"$edges",initialValue:[],in:{$cond:[{$gt:[{$size:{$filter:{input:"$$value",as:"subgroup",cond:{$gt:[{$size:{$setIntersection:["$$subgroup","$$this"]}},0]}}}},0]},{$map:{input:"$$value",as:"subgroup",in:{$cond:[{$gt:[{$size:{$setIntersection:["$$subgroup","$$this"]}},0]},{"$setUnion":["$$this","$$subgroup"]},"$$subgroup"]}}},{$concatArrays:["$$value",["$$this"]]}]}}}}}]}},{$unwind:{path:"$single",preserveNullAndEmptyArrays:true}},{$unwind:{path:"$clusters",preserveNullAndEmptyArrays:true}},{$project:{groups:{$concatArrays:["$clusters.groups",{$map:{input:{$filter:{input:"$single.potentionals",as:"pot",cond:{$eq:[{$size:{$setIntersection:[["$$pot"],"$clusters.all"]}},0]}}},as:"single",in:["$$single"]}}]}}}])

Result