Manejo de conflictos en encontrar, modificar, guardar flujo en MongoDB con Mongoose

Me gustaría actualizar un documento que implique la lectura de otras colecciones y modificaciones complejas, por lo que los operadores de actualización en findAndModify() no pueden cumplir mi propósito.

Esto es lo que tengo:

 Collection.findById(id, function (err, doc) { // read from other collection, validation // modify fields in doc according to user input // (with decent amount of logic) doc.save(function (err, doc) { if (err) { return res.json(500, { message: err }); } return res.json(200, doc); }); } 

Mi preocupación es que este flujo podría causar conflictos si varios clientes modifican el mismo documento.
Aquí se dice que:

Las operaciones en un solo documento son siempre atómicas con las bases de datos MongoDB

Estoy un poco confundido sobre lo que significa Operations .

  • ¿Esto significa que findById() adquirirá el locking hasta que doc esté fuera del scope (después de que se envíe la respuesta), por lo que no habría conflictos? (No lo creo)
  • Si no, ¿cómo modificar mi código para que sea compatible con varios clientes sabiendo que modificarán la Colección?
  • ¿Mongoose reportará conflicto si ocurre?
  • ¿Cómo manejar el posible conflicto? ¿Es posible bloquear manualmente la Colección?
    • Veo la sugerencia de usar la versionKey (o marca de tiempo) de Mongoose y volver a intentarlo para el documento obsoleto
    • No uses MongoDB por completo …

Gracias.


EDITAR

Gracias a @jibsales por el puntero, ahora uso la versionKey de Mongoose (la marca de tiempo también funcionará) para evitar cometer conflictos.

aaronheckmann – Mongoose v3 part 1 :: Versiones

Vea este código de ejemplo:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8

Operaciones se refiere a lecturas / escrituras. Tenga en cuenta que MongoDB no es una capa de datos compatible con ACID y si necesita un verdadero cumplimiento de ACID, es mejor que elija otra tecnología. Dicho esto, puede lograr la atomicidad y el aislamiento mediante la técnica de compromiso de dos fases que se describe en este artículo en los documentos de MongoDB . Esta no es una tarea pequeña, así que prepárese para un trabajo pesado, ya que tendrá que trabajar con el conductor nativo en lugar de Mongoose. Una vez más, mi última sugerencia es no beber el NoSQL koolaid si necesita soporte para transacciones, lo que suena como lo hace usted.

Cuando MongoDB recibe una solicitud para actualizar un documento, bloqueará la base de datos hasta que haya completado la operación. Cualquier otra solicitud que reciba MongoDB esperará hasta que la operación de locking se haya completado y la base de datos esté desbloqueada. Este comportamiento de locking / espera es automático, por lo que no hay conflictos que manejar. Puede encontrar mucha más información sobre este comportamiento en la sección Concurrencia de las Preguntas frecuentes.

Consulte la respuesta de jibsales para obtener enlaces a la técnica recomendada de MongoDB para realizar transacciones de varios documentos.

Hay un par de bases de datos NoSQL que realizan transacciones completas de ACID, lo que haría su vida mucho más fácil. FoundationDB es una de esas bases de datos. Los datos se almacenan como Key-Value pero admiten múltiples modelos de datos a través de capas.

Revelación completa: soy ingeniero en FoundationDB.