TL;DR:$inc
garanterar uppdateringar på plats, $set
inte, men under mycket specifika omständigheter kan det också göras på plats.
Detaljer
Det finns två aspekter av detta:
-
hur går det över tråden?
Informationen skickas som en operation, en
$set
förblir en$set
så det är ett delta. Det är också sant för oploggen som används för replikering. På detta sätt använder du$set
är effektivare med avseende på bandbredd. -
hur uppdateras den på disken?
MongoDB utför en uppdatering på plats om och bara om nyckeln (fältet) redan finns , så när du lägger till ett nytt fält i ett dokument är det en större operation än att bara tilldela ett annat värde till ett befintligt fält.
Även då måste dock värdena ha samma storlek och får inte ändra typ och de måste vara av typen
double, long, int or bool
, annars är det inte en uppdatering på plats för närvarande.
Jag är inte säker på hur det senare är riktigt viktigt i praktiken , men servern använder definitivt helt olika kodsökvägar för de två, så det kan till exempel leda till fältomordning. För mycket stora dokument kommer det förmodligen att resultera i en mätbar skillnad i prestanda.
Detta visar att $inc
är väldigt annorlunda genom att det bara tillåter operationer som säkert är på plats, eftersom $inc
fungerar bara på numeriska typer och kan naturligtvis inte ändra storlek eller typ.