sql >> Base de Datos >  >> NoSQL >> MongoDB

¿MongoDB $set escribe solo el campo o todo el documento?

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:

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

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