updatemany update nodejs findoneandupdate findandmodify example array mongodb

update - ¿Cuál es la diferencia entre findAndModify y la actualización en MongoDB?



update mongodb nodejs (4)

De los documentos de MongoDB (énfasis agregado):

  • Por defecto, ambas operaciones modifican un solo documento. Sin embargo, el método update () con su opción múltiple puede modificar más de un documento .

  • Si varios documentos coinciden con los criterios de actualización, para findAndModify (), puede especificar una clasificación para proporcionar cierta medida de control sobre qué documento actualizar. Con el comportamiento predeterminado del método update (), no puede especificar qué documento único actualizar cuando coinciden varios documentos.

  • Por defecto, el método findAndModify () devuelve la versión pre-modificada del documento . Para obtener el documento actualizado, use la nueva opción. El método update () devuelve un objeto WriteResult que contiene el estado de la operación. Para devolver el documento actualizado, use el método find (). Sin embargo, otras actualizaciones pueden haber modificado el documento entre su actualización y la recuperación del documento. Además, si la actualización modificó solo un documento pero coinciden varios documentos, deberá usar una lógica adicional para identificar el documento actualizado.

  • No se puede especificar una preocupación de escritura para encontrarAndModify () para anular la preocupación de escritura predeterminada mientras que, comenzando en MongoDB 2.6, puede especificar una preocupación de escritura para el método update ().

Al modificar un único documento, tanto findAndModify () como el método update () actualizan atómicamente el documento.

Estoy un poco confundido por el método findAndModify en MongoDB. ¿Cuál es la ventaja de esto sobre el método de update ? Para mí, parece que solo devuelve el artículo primero y luego lo actualiza. Pero, ¿por qué tengo que devolver el artículo primero? Leí el MongoDB: la guía definitiva y dice que es útil para manipular colas y realizar otras operaciones que necesitan una atomicidad de estilo para obtener y configurar. Pero no entendí cómo logra esto. ¿Puede alguien explicarme esto?


Si busca un elemento y luego lo actualiza, puede haber una actualización por otro hilo entre esos dos pasos. Si primero actualiza un artículo y luego lo busca, puede haber otra actualización intermedia y recibirá un artículo diferente al que actualizó.

Hacerlo "atómicamente" significa que tiene la garantía de que está recibiendo el mismo artículo exacto que está actualizando, es decir, no puede haber ninguna otra operación en el medio.


Una clase útil de casos de uso es contadores y casos similares. Por ejemplo, eche un vistazo a este código (una de las pruebas de MongoDB): find_and_modify4.js .

Por lo tanto, con findAndModify usted incrementa el contador y obtiene su valor incrementado en un solo paso. Compare: si (A) realiza esta operación en dos pasos y alguien más (B) realiza la misma operación entre los pasos, entonces A y B pueden obtener el mismo valor de contador en lugar de dos diferentes (solo un ejemplo de posibles problemas).


findAndModify devuelve el documento, la actualización no.

Si entendí correctamente a Dwight Merriman (uno de los autores originales de mongoDB), usar la actualización para modificar un único documento, es decir ("multi": falso) también es atómico. Actualmente, también debería ser más rápido que hacer la actualización equivalente usando findAndModify .