es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo reescribir Uni> a Multi sin una lista? Programación Reactiva.

Como estoy trabajando en un proyecto en el que quiero reescribir Uni a Multi para un método “findall” para obtener todos los documentos de mongodb de una colección. Intenté reescribirlo, pero no pude encontrar una solución.

Original:

public Uni<List<Book>> findAll(List<String> authors)
{

return getCollection().
find(Filters.all("authors",authors)).map(Book::from).collectItems().asList();
}

Lo que intenté (pero no funciona)

public Multi<Book> findAll(List<String> authors)

{

return getCollection().find(Filters.all("authors",authors)).transform().
byFilteringItemsWith(Objects::nonNull).onCompletion().ifEmpty().
failWith(new NoSuchElementException("couldn't find the Authors")).onItem().transform(Book::from);
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para reescribir Uni<><book>> a Multi<book> en el método findAll para obtener todos los documentos MongoDB de una colección, puedes probar el siguiente fragmento de código:

    public Multi<book> findAll(List<string> authors) {
    
        return Multi.createFrom().emitter(emitter -> {
            getCollection().find(Filters.all("authors", authors))
            .forEach(book -> {
                emitter.emit(book.from());
            }, emitter::fail)
            // complete when all items emitted
            .whenComplete((result, throwable) -> {
                if (throwable != null) {
                    emitter.fail(throwable);
                } else {
                    emitter.complete();
                }
            });
        });
    }
    

    Este código crea un flujo Multi utilizando emitter. Dentro del emitter, usamos el método forEach de MongoDB para iterar a través del conjunto de resultados y emitir cada objeto Book usando emitter.emit(). Si hay algún error durante la iteración, llamamos a emitter.fail(). Una vez que se han emitido todos los elementos, llamamos a emitter.complete().

Comments are closed.