¿Cómo puedo hacer actualizaciones del “mismo método de ACTUALIZACIÓN” en 02 colecciones “al mismo tiempo” utilizando Spring Data ReactiveMongoTemplate?
1) Descripción del problema:
- Estoy utilizando Reactive Spring-Data + Spring WebFlux + MongoDb + ReactiveMongoTemplate;
- Tengo 02 Colecciones: Task y Project
2) Mi objetivo es:
- Usando solo “un método de actualización”
- que actualice los 02 documentos dentro de las 02 Colecciones (al mismo tiempo – simultáneamente)
3) Código: ###
3.1) Colección Task ####
@Document(collection = "task")
public class Task {
@Id
private String _id;
@Field("pid")
private String projectId;
private String taskName;
private String ownerProject;
}
<h4>3.2) Colección Project ####</h4>
<p>“`lang-java
@Document(collection = “project”)
public class Project {
@Id
private String _id;
private String ownerProject;
private Task tasksProject;
private String code;
}
3.3) Mi código actual - que no funciona ####
```lang-java public MonoupdateWithCriteriaTemplateMult(String id) { Query projectDocument = new Query(); projectDocument.addCriteria(Criteria.where("_id") .is(id)); Query taskDocument = new Query(); taskDocument.addCriteria(Criteria.where("projectId") .is(id)); return template .update(projectDocument, Project.class) .then(template.update(taskDocument, Task.class)) ;
}
2) Pregunta: ###
- ¿Cómo puedo codificar/hacer que “el mismo método de ACTUALIZACIÓN” actualice ambas Colecciones “al mismo tiempo” utilizando ReactiveMongoTemplate?
- Ejemplo 01: Mi método necesita “actualizar” el campo “ownerProject” en ambas Colecciones:
- Task: en este caso ‘ownerProject’ es un campo simple
- Project: en este caso ‘ownerProject’ es un campo simple
- Ejemplo 02:
- Mi método necesita “actualizar” el campo “taskName” en ambas Colecciones:
- Task: en este caso ‘TaskName’ es un campo simple
- Project: en este caso ‘TaskName’ es un campo dentro de “tasksProject”
Gracias por cualquier ayuda
davy.ai
Solución
Para actualizar documentos en varias colecciones utilizando un único método de actualización, podemos utilizar la interfaz
ReactiveMongoOperations
proporcionada por Spring Data MongoDB. Esta interfaz proporciona un métodoinTransaction()
que nos permite ejecutar un conjunto de operaciones en una sola transacción a través de varias colecciones.Aquí hay una versión actualizada del método
updateWithCriteriaTemplateMult()
que actualiza el campoownerProject
en las coleccionesTask
yProject
:TransactionalOperator
utilizando elreactiveMongoTransactionManager
, el cual debe ser configurado antes de poder llamar a este método.transactionalOperator.execute()
.reactiveMongoTemplate.updateMulti()
para actualizar el campoownerProject
en las coleccionesTask
yProject
.all()
para recopilar todos los resultados de las actualizaciones en el Mono.Mono.zip()
para combinar dos Monos en un solo Mono.Para actualizar el campo anidado
taskName
en las coleccionesTask
yProject
, podemos utilizar el siguiente método:reactiveMongoTemplate.updateMulti()
para actualizar el campotaskName
en las coleccionesTask
yProject
.Task
, utilizamosUpdate.update("taskName", taskName)
.Project
, utilizamosUpdate.update("tasksProject.taskName", taskName)
para actualizar el campo anidadotaskName
dentro deTask
.Mono.zip()
para combinar dos Monos en un solo Mono.Nota: En ambos métodos, estamos utilizando el
reactiveMongoTransactionManager
, el cual debe ser configurado en nuestro contexto de aplicación. Podemos configurarlo de la siguiente manera:Esto configura un bean
ReactiveMongoTransactionManager
que se puede utilizar para crear unTransactionalOperator
en nuestros métodos de actualización.¡Espero que esto ayude! Avísame si tienes alguna otra pregunta.