Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

380
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda