TL;DR:$inc
zaručuje aktualizace na místě, $set
ne, ale za velmi specifických okolností to lze provést na místě.
Podrobnosti
To má dva aspekty:
-
jak to jde přes drát?
Informace je odeslána jako operace,
$set
zůstává$set
takže je to delta. To platí také pro oplog, který se používá pro replikaci. Tímto způsobem pomocí$set
je efektivnější s ohledem na šířku pásma. -
jak se aktualizuje na disku?
MongoDB provede aktualizaci na místě pouze tehdy, pokud klíč (pole) již existuje , takže když do dokumentu přidáte nové pole, je to větší operace než pouhé přiřazení jiné hodnoty existujícímu poli.
I potom však musí mít hodnoty stejnou velikost a nesmí neměnit typ a musí být typu
double, long, int or bool
, jinak to není aktuálně na místě aktualizace.
Nejsem si jistý, jak je to druhé skutečně důležité v praxi , ale server rozhodně používá zcela odlišné cesty kódu pro tyto dva, takže to může vést například k přeuspořádání polí. U velmi velkých dokumentů to pravděpodobně povede k měřitelnému rozdílu ve výkonu.
To ukazuje, že $inc
se velmi liší v tom, že umožňuje pouze operace, které jsou jistě na místě, protože $inc
funguje pouze na číselných typech a nemůže samozřejmě měnit velikost ani typ.