TL;DR:$inc garantisce aggiornamenti sul posto, $set no, ma in circostanze molto specifiche può anche essere fatto sul posto.
Dettagli
Ci sono due aspetti in questo:
-
come va oltre il filo?
L'informazione viene inviata come operazione, un
$setrimane un$setquindi è un delta. Ciò vale anche per l'oplog utilizzato per la replica. In questo modo, usando$setè più efficiente rispetto alla larghezza di banda. -
come si aggiorna su disco?
MongoDB esegue un aggiornamento sul posto se e solo se la chiave (campo) esiste già , quindi quando aggiungi un nuovo campo a un documento, si tratta di un'operazione più ampia rispetto alla semplice assegnazione di un valore diverso a un campo esistente.
Anche in questo caso, tuttavia, i valori devono avere la stessa dimensione e non deve cambiare tipo e devono essere di tipo
double, long, int or bool, altrimenti non un aggiornamento sul posto attualmente.
Non sono sicuro di come quest'ultimo sia davvero importante in pratica , ma il server utilizza sicuramente percorsi di codice completamente diversi per i due, quindi può ad esempio portare al riordino dei campi. Per documenti molto grandi, ciò comporterà probabilmente una differenza misurabile nelle prestazioni.
Questo mostra che $inc è molto diverso in quanto consente solo operazioni che sono certamente sul posto, perché $inc opera solo su tipi numerici e non può cambiare dimensione o tipo, naturalmente.