Удаление объектов из потока, которые уже находятся в базе данных, реактивным способом - PullRequest
0 голосов
/ 28 января 2019

Я сканирую каталог для файлов, затем обрабатываю результаты.Я хочу удалить файлы из результата сканирования, которое у меня уже есть в хранилище данных, перед дальнейшей обработкой.

Попытка сделать это реактивным способом, используя реактивный mongodb.Я просто не уверен, как реализовать фильтр таким образом, чтобы использовать результат запроса к базе данных.

@Override
public Flux<File> findFiles(Directory directory) {

    // Only get these file types as we can't process anything else
    final Predicate<Path> extensions = path ->
            path.toString().endsWith(".txt") ||
                    path.toString().endsWith(".doc") ||
                    path.toString().endsWith(".pdf");

    final Set<File> files = fileService.findAll(Paths.get(directory.getPath()), extensions);

    final Stream<Video> fileStream = files
            .stream()
            .map(this::convertFileToDocument)

            // This is wrong (doesn't compile for a start), but how do I do something similar or of this nature? 
            .filter(file -> fileRepository.findById(file.getId()));

    return Flux.fromStream(fileStream);
}

convertFileToDocument просто отображает файл в POJO, там ничего интересного не происходит.

Как я могу добавить фильтр на основе результата findById, или есть лучший способ добиться этого?

1 Ответ

0 голосов
/ 28 января 2019

Если fileRepository.findById возвращает Mono, я бы порекомендовал вам преобразовать поток в поток, а затем отфильтровать, используя filterWhen;проверка, есть ли в Mono элемент.Что-то вроде

final Stream<Video> fileStream = files
        .stream()
        .map(this::convertFileToDocument);
return Flux.fromStream(fileStream).filterWhen(file -> fileRepository.findById(file.getId()).hasElement().map(b -> !b));

Это отфильтрует все файлы, которые возвращают непустое Mono для findById или существуют в базе данных.Если я что-то неправильно понял, пожалуйста, дайте мне знать.

...