Database
db={"permissions":[{"_id":1,"resource":"resource:docs/61","permissions":[{"permission":"role:documentOwner","users":["user:abc","user:def","group:abc","group:bff"]},{"permission":"document.read","users":["user:xxx"]},{"permission":"document.update","users":["user:xxx"]}]},{"_id":2,"resource":"resource:docs/38","permissions":[{"permission":"role:documentOwner","users":["user:abc","user:def","group:abc","group:bff"]},{"permission":"document.read","users":["user:xxx"]},{"permission":"document.update","users":["user:xxx"]}]}],"groups":[{"_id":1,"id":"abc","name":"Test Group","users":["cpo","yyy","xxx"]},{"_id":2,"id":"bff","name":"Something","users":["xxx"]}]}
Query
db.permissions.aggregate([{"$unwind":"$permissions"},{"$unwind":"$permissions.users"},{$match:{$expr:{$eq:[0,{$indexOfCP:["$permissions.users","user:"]}]}}},{"$lookup":{"from":"groups","let":{"u":{"$arrayElemAt":[{"$split":["$permissions.users",":"]},1]}},"pipeline":[{"$match":{"$expr":{"$in":["$$u","$users"]}}},{"$project":{"_id":0,"id":1,"name":1,}}],"as":"groupLookup"}},{"$group":{"_id":{"$arrayElemAt":[{"$split":["$permissions.users",":"]},1]},"groups":{"$addToSet":"$groupLookup"},"permissions":{"$addToSet":{"permissions":"$permissions.permission","resource":"$resource"}}}},{"$addFields":{"groups":{"$reduce":{"input":"$groups","initialValue":[],"in":{"$concatArrays":["$$value","$$this"]}}},}}])