Soy relativamente nuevo en trabajar con mongodb. Actualmente me estoy familiarizando un poco más con la API y especialmente con los controladores de C#. Tengo algunas preguntas de comprensión sobre las actualizaciones masivas. Como el controlador de C# ofrece un método BulkWriteAsync, pude leer mucho al respecto en la documentación de mongo. Según tengo entendido, es posible configurar BulkWrite para que no se detenga en caso de error en cualquier paso. Esto se puede hacer usando la configuración desordenada. Lo que no encontré es qué sucede con los datos. ¿La base de datos realiza una reversión en caso de error? ¿O tengo que usar un entorno por mi cuenta? En caso de error: ¿puedo obtener detalles de qué paso no fue exitoso? Piense en un bulto con actualizaciones de 100 documentos. ¿Puedo averiguar qué actualizaciones no se realizaron correctamente? Como BulkWriteResult ofrece muy poca información, no estoy seguro de si esta operación es realmente buena para mí.
gracias de antemano
Tiene razón en que BulkWriteResult no proporciona el conjunto completo de información para hacer una llamada sobre qué hacer.
Sin embargo, en el caso de una MongoBulkWriteException<T> , puede acceder a la propiedad WriteErrors para obtener los índices de los modelos con errores. Aquí hay un ejemplo reducido de cómo usar la propiedad.
var models = sourceOfModels.ToArray(); for (var i = 0; i < MaxTries; i++) try { return await someCollection.BulkWriteAsync(models, new BulkWriteOptions { IsOrdered = false }); } catch (MongoBulkWriteException e) { // reconstitute the list of models to try from the set of failed models models = e.WriteErrors.Select(x => models[x.Index]).ToArray(); } Nota: Lo anterior es un código muy ingenuo. Mi código real es más sofisticado. Lo que hace lo anterior es intentar una y otra vez escribir, en cada caso, solo con las escrituras pendientes. Digamos que comenzó con 1000 modelos de ReplaceOne<T> para escribir, y 900 pasaron; el segundo intento intentará contra los 100 restantes, y así sucesivamente hasta que se agoten los reintentos o no haya errores.
Si el código no está dentro de una transacción y ocurre un error, por supuesto que no se revierte nada; tienes algunas escrituras que tienen éxito y otras que no. En el caso de una transacción, la excepción aún se genera (MongoDB 4.2+). Antes de eso, no obtendría una excepción.
Finalmente, mientras que el valor predeterminado es escritura ordenada, la escritura no ordenada puede ser muy útil cuando las escrituras no están relacionadas entre sí (por ejemplo, documentos que representan agregados DDD donde no hay dependencias). Es esta misma "falta de relación" la que también obvia la necesidad de una transacción.