Spring Data Mongo - обновление нескольких записей - PullRequest
1 голос
/ 16 мая 2019

Мне нужно обновить несколько записей.Я не могу выполнить массовый запрос на обновление по критериям, потому что у нас есть правило, что для каждого изменения БД мы должны отправлять сообщение брокеру сообщений.Поэтому мне нужно обновить сущности один за другим .

Я использую Spring Data Repository.Я могу сделать это, выполняя постраничные запросы и обновляя элементы на страницах.

https://www.baeldung.com/spring-data-repositories

@Service
class MyEntityService {
    MyEntityRepository myEntityRepository; // extends PagingAndSortingRepository<MyEntity, ObjectId>

    updateMultipleEntities(UpdateRules updateRules) {
        Criteria criteria = buildCriteria(updateRules);
        long totalrecords = myEntityRepository.count(criteria);
        long totalUpdateCound = 0;

        // LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE

        while (totalUpdateCound < totalrecords) {
            Page page = myEntityRepository.findAll(buildPageble(totalUpdateCound, criteria));
            processElementsFromPage(page);
        }
    }
}

Другим решением является потоковая передача всех элементов и их обновление.Это выглядит проще.

@Service
class MyEntityService {
    MyEntityRepository myEntityRepository; // extends CrudRepository<MyEntity, ObjectId>

    updateMultipleEntities(UpdateRules updateRules) {
        Criteria criteria = buildCriteria(updateRules);

        // LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE
        myEntityRepository.streamAll(criteria).forEach(element -> processElement(element, updateRules));

    }
}

Есть ли недостатки у решения, использующего streamAll(criteria)?Как я понимаю, было бы полезно использовать постраничные запросы, если мне нужно иметь нумерацию страниц в пользовательском интерфейсе.Однако как насчет моего случая, когда мне нужно обрабатывать элементы один за другим.

Обновление

http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html

Пример того, почему потоковые результаты могут повысить производительность.Тем не менее, он показывает только только для чтения случаев.

...