Rx java 如何在RxJava和couchbase中使用排序?
我已经写了下面提到的从couchbase服务器批量获取数据的方法Rx java 如何在RxJava和couchbase中使用排序?,rx-java,couchbase,Rx Java,Couchbase,我已经写了下面提到的从couchbase服务器批量获取数据的方法 bucket.async() .query(N1qlQuery.simple(query)) .doOnNext(res -> res.info().map(N1qlMetrics::elapsedTime).forEach(t -> System.out.println(t))) .flatMap(AsyncN1qlQueryResult::ro
bucket.async()
.query(N1qlQuery.simple(query))
.doOnNext(res -> res.info().map(N1qlMetrics::elapsedTime).forEach(t -> System.out.println(t)))
.flatMap(AsyncN1qlQueryResult::rows)
.flatMap(row ->
bucket.async().
get(row.value().getString("id")))
.map(JsonDocument::content).
toList()
.toBlocking()
.single();
当我传递查询时,此代码工作正常
"SELECT meta().id as id FROM bucket"
但是当我使用类似
"SELECT meta().id as id FROM bucket order by id ASC"
我得到的结果没有分类。但是,当我在查询控制台上运行相同的查询时,结果与预期的一样。这让我相信我在rxJava中做错了什么。请帮我解决这个问题。订单丢失是因为
flatMap()
运算符应用并发流,但不维护订单。当您应用
flatMap()
时,您正在为每个onNext()
创建并订阅一个新的可观察的
,这意味着对于每一行,您并行执行这一行:
bucket.async().
get(row.value().getString("id")))
然后,每个get操作将在不同的时间内完成,并且获取的内容将以非顺序方式发出
如果您想维护顺序,但又不想失去并行性,那么应该使用只维护1个活动流,并按顺序订阅每个获取操作的
如果您确实需要/想要并行性,您应该使用,它将并行执行每个创建的可观察对象,但将按顺序发出项目。我同意这一点,我认为ConcatMapEarge是一种方法。我们已经为视图和“包含文档”执行了此操作,请查看您是否对详细信息感兴趣。