es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de realizar una actualización diferente para cada uno de varios documentos (actualización masiva) en spring-data-mongodb-reactive?

Estoy utilizando spring-boot-starter-data-mongodb-reactive en la versión más reciente actual. Necesito actualizar un campo de conteo en muchos documentos de mi colección, pero el campo de conteo es diferente para cada documento. Estoy buscando una forma de realizar una actualización en masa para no tener que realizar una actualización para cada elemento por separado, un millón de veces.

Mi primer enfoque ha sido crear una lista de UpdateOneModel que contenga los criterios (Criteria) y la actualización (Update). Puedo obtener la colección desde la instancia de ReactiveMongoOperations, pero esto parece una forma bastante incómoda de hacerlo. Se ve así:

Mono<><document>> collection = mongoOps.getCollection(mongoOps.getCollectionName(Foo.class));
BulkWriteOptions options = new BulkWriteOptions()
        .bypassDocumentValidation(true)
        .ordered(false);
return result.getCounts()
        .reduce(<creando un="" mapa="" de="" id="" a="" nuevo="" conteo="">)
        .map(<creando una="" instancia="" de=""></creando><document>>)
        .map(updates -> collection.map(c -> c.bulkWrite(updates, bulkWriteOptions)))
        .then();

Esto se siente como una forma extraña (y casi bruta) de intentar realizar una actualización en masa. ¿Me estoy perdiendo algo? Normalmente, Spring incluye métodos para realizar actualizaciones en masa, pero su biblioteca de Mongo reactiva aparentemente no lo incluye. ¿Qué más podría intentar?

Tags:  

Answer

  1. Avatar for davy.ai

    Si bien Spring proporciona métodos para realizar actualizaciones masivas en implementaciones tradicionales de MongoDB, la biblioteca reactiva de MongoDB actualmente no proporciona tales métodos.

    Un enfoque posible es utilizar ReactiveMongoOperations para ejecutar una operación updateMulti en toda la colección y proporcionar un objeto Criteria que coincida con todos los documentos de la colección. Esto actualizará todos los documentos de la colección con una sola operación, pero no permitirá diferentes valores de actualización para cada documento.

    Otra alternativa es considerar el uso directo de la biblioteca mongo-java-driver. El controlador proporciona una clase BulkWriteOperation que permite realizar múltiples operaciones de actualización de forma atómica. Esto se puede utilizar con el controlador reactiva de MongoDB para realizar una operación de actualización masiva.

    Ejemplo:

    List<><document>> updates = new ArrayList<>();
    result.getCounts().toIterable().forEach(count -> {
        updates.add(new UpdateOneModel<>(new Document("_id", count.getId()),
                    new Document("$set", new Document("count", count.getNewCount()))));
    });
    BulkWriteOptions options = new BulkWriteOptions().ordered(false);
    mongoTemplate.execute(Foo.class, collection -> collection.bulkWrite(updates, options)).block();
    

    Este enfoque crea una lista de objetos UpdateOneModel donde cada UpdateOneModel especifica un Criteria que coincide con un solo documento y una Update que establece el valor apropiado para el campo de conteo. Luego, estos se envían al método bulkWrite de la colección, que realiza una sola operación atómica que actualiza todos los documentos afectados.

    En general, si bien la biblioteca reactiva de MongoDB actualmente disponible en Spring no incluye métodos de actualización masiva, aún existen diferentes enfoques que se pueden utilizar para realizar actualizaciones masivas eficientes.

Comments are closed.