Сначала вам не нужно иметь Flowable
с List
из Product
, потому что Flowable
может управлять более чем одним значением, в отличие от Single
. Итак, достаточно Flowable<Product>
. Затем вы можете просто вернуть экземпляр Flowable
из метода find
.
Текстовый поиск может быть реализован следующим образом:
public Flowable<Product> findByFreeText(final String query) {
return Flowable.fromPublisher(repository.getCollection("product", Product.class)
.find(new Document("$text",
new Document("$search", query)
.append("$caseSensitive", false)
.append("$diacriticSensitive", false)
)));
}
Затем потребителю метода решать, как он подписывается на результат Flowable
. В контроллере вы можете напрямую вернуть экземпляр Flowable
. Если вам нужно использовать это где-то в вашем коде, вы можете использовать subscribe()
или blockingSubscribe()
и так далее.
И вы, конечно, можете протестировать это с помощью JUnit следующим образом:
@MicronautTest
class SomeServiceTest {
@Inject
SomeService service;
@Test
void findByFreeText() {
service.findByFreeText("test")
.test()
.awaitCount(1)
.assertNoErrors()
.assertValue(p -> p.getName().contains("test"));
}
}
Обновление: вы можете отладить обмен данными с MongoDB, установив это в logback.xml (Micronaut использует Logback в качестве среды ведения журнала по умолчанию), в файле конфигурации журнала:
<configuration>
....
<logger name="org.mongodb" level="debug"/>
</configuration>
Тогда вы увидите это в файле журнала:
16:20:21.257 [Thread-5] DEBUG org.mongodb.driver.protocol.command - Sending command '{"find": "product", "filter": {"$text": {"$search": "test", "$caseSensitive": false, "$diacriticSensitive": false}}, "batchSize": 2147483647, "$db": "some-database"}' with request id 6 to database some-database on connection [connectionId{localValue:3, serverValue:1634}] to server localhost:27017
16:20:21.258 [Thread-8] DEBUG org.mongodb.driver.protocol.command - 16:20:21.258 [Thread-7] DEBUG org.mongodb.driver.protocol.command - Execution of command with request id 6 completed successfully in 2.11 ms on connection [connectionId{localValue:3, serverValue:1634}] to server localhost:27017
Затем вы можете скопировать команду из журнала и попробовать ее в командной строке MongoDB или установить MongoDB Compass. где вы можете поиграть с этим еще и посмотреть, верна ли команда или нет.
person
cgrim
schedule
01.11.2020