TL;DR:$inc garantiza actualizaciones en el lugar, $set no lo hace, pero en circunstancias muy específicas también se puede hacer en el lugar.
Detalles
Hay dos aspectos en esto:
-
¿Cómo pasa por el cable?
La información se envía como una operación, un
$setsigue siendo un$setpor lo que es un delta. Eso también es cierto para el registro de operaciones que se usa para la replicación. De esta forma, usando$setes más eficiente con respecto al ancho de banda. -
¿Cómo se actualiza en el disco?
MongoDB realiza una actualización en el lugar si y solo si la clave (campo) ya existe , por lo que cuando agrega un nuevo campo a un documento, es una operación más grande que simplemente asignar un valor diferente a un campo existente.
Incluso entonces, sin embargo, los valores deben tener el mismo tamaño y no debe cambiar de tipo y deben ser del tipo
double, long, int or bool, de lo contrario no una actualización en el lugar actualmente.
No estoy seguro de cómo esto último es realmente importante en la práctica , pero el servidor definitivamente usa rutas de código completamente diferentes para los dos, por lo que, por ejemplo, puede conducir a la reordenación de campos. Para documentos muy grandes, eso probablemente resultará en una diferencia medible en el rendimiento.
Esto muestra que $inc es muy diferente en el sentido de que solo permite operaciones que ciertamente están en su lugar, porque $inc solo opera en tipos numéricos y no puede cambiar el tamaño o el tipo, naturalmente.