Quake was one of the first games to deal with this problem, and many of the techniques it used are potentially still valid even today.
It's source code is freely available and can be studied (it is also quite grim reading in places).
To summarize some of the techniques:
Visibility for each map was precalculated so that fast checks could be made for which entities are visible to each player, and only visible entities need be sent.
Because the client and server potentially tick at different rates, everything potentially visible, irrespective of field-of-view, is sent.
Baseline states and deltas are used so that only data which has actually changed need be sent. Clients can work from a local copy of anything which is unchanged.
These were valid on low-bandwidth dial-up connections back in the late 1990s so can make a good starting point for today, and can also serve to illustrate areas that you probably don't need to be worrying about. An example of the latter is the fact that the server sends entities irrespective of field-of-view: use of baselines and deltas means that the actual data sent can be kept quite small, and this is probably not a problem.