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
$set
rimane un$set
quindi è 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.