Rx java 如何在RxJava和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

我已经写了下面提到的从couchbase服务器批量获取数据的方法

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是一种方法。我们已经为视图和“包含文档”执行了此操作,请查看您是否对详细信息感兴趣。