MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $set scrive solo il campo o l'intero documento?

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:

  1. 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.

  2. 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.