Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

367
Views
C# BulkWriteAsync, transacciones y resultados

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

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!