¿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?
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ónupdateMulti
en toda la colección y proporcionar un objetoCriteria
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 claseBulkWriteOperation
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:
Este enfoque crea una lista de objetos
UpdateOneModel
donde cadaUpdateOneModel
especifica unCriteria
que coincide con un solo documento y unaUpdate
que establece el valor apropiado para el campo de conteo. Luego, estos se envían al métodobulkWrite
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.