Tengo una lista de registros como
[ {"id":"1", "name":"a", "user":"u1"}, {"id":"2", "name":"b", "user":"u1"}, {"id":"3", "name":"c", "user":"u1"} ] Ahora, según si una entrada ya existe o no en la base de datos, debe actualizar o insertar el documento. También para la actualización existe la condición de que el valor del campo de user existente debe coincidir con el valor proporcionado para user en el documento.
Por supuesto que puedo ejecutar la lista en un bucle y usar
mongoOperations.save(...);Pero si tengo una lista enorme, tendré que hacer una operación de db por cada entrada, lo que no creo que sea eficiente. ¿Hay alguna otra forma eficiente de realizar esta operación?
Si está utilizando el repositorio CRUD, el repositorio CRUD proporciona el método save () que se puede usar para la entidad única (mongoCollection) o puede usar el método de guardado sobrecargado
<S extends T> List<S> saveAll(Iterable<S> entites)que puede tomar Arraylist y guardar el objeto arraylist. No es necesario utilizar los bucles.
Puede ver el siguiente ejemplo en el que la clase InventoryService crea 3 objetos de inventario y agrega todo en ArrayList y finalmente pasa esto al repositorio de inventario, que es un repositorio CRUD.
@Service public class InventoryService { private static final Logger LOGGER = LoggerFactory.getLogger(InventoryService.class); @Autowired private InventoryRepository inventoryRepository; public void aveInventoryDetails() { List<Inventory> inventoryList = new ArrayList<Inventory>(); inventoryList.add(new Inventory("500", 10)); inventoryList.add(new Inventory("600", 20)); inventoryList.add(new Inventory("700", 30)); try { inventoryRepository.saveAll(inventoryList); } catch (Exception e) { e.printStackTrace(); } } }Repositorio Mongo de muestra
package com.bjs.repository; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.mongodb.repository.MongoRepository; import com.bjs.model.Inventory; public interface InventoryRepository extends MongoRepository<Inventory, String> { // empty as not defining any new method , we can use the existing save method }Puede usar mongoTemplate.updateMulti() para actualizar la lista de registros como se muestra a continuación
Query query = new Query(); query.addCriteria(Criteria.where("filteringField").is("filteringFieldValue)); Update update = new Update(); update.set("fieldToBeUpdated", "fieldToBeUpdatedValue"); mongoTemplate.updateMulti(query, update, YourClass.class);