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
$set
sigue siendo un$set
por 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$set
es 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.