I think the main problem with your issue is that you $match after 2 $lookup by starting the aggregation on data. You lookup all your data for both users and providers and match to only get a subset.

Assuming you have more users and providers, start the aggregation on users matching right away with your regex. This way you would only $lookup for providers for matching users.

An alternative way would be to move the $match on users, in a pipeline of the first $lookup, then $match out empty user_info. The do the same with providers.

After thinking about it, the alternative way is easier to implement from the what you already have. See this playground modified from yours.