Mi chiedo se il driver sia abbastanza intelligente da aggiornare solo il più piccolo sottoinsieme di modifiche o se stia semplicemente aggiornando alla cieca l'intera cosa?
No, se utilizzi il metodo di aggiornamento "normale", l'intero oggetto verrà inviato via cavo. Sospetto che il server del database stesso sarà abbastanza intelligente da aggiornare solo gli indici necessari (e non quelli che non sono cambiati), se possibile (cioè l'oggetto potrebbe essere aggiornato sul posto e non è stato necessario spostarlo perché è cresciuto troppo)
Quello che puoi fare è usare le funzioni "modificatore di aggiornamento atomico". La documentazione Java è un po' leggera su di loro, ma poiché il driver trasmette solo il JSON, le cose dei tutorial non Java dovrebbero funzionare, ad esempio:
shapes.update((DBObject)JSON.parse( "{ 'foo' : 'bar'}"),
(DBObject) JSON.parse( "{ '$set' : { 'foo': 'bat'}}") );