Java SDK 2.2.6 和 Couchbase 服务器 4.1。
我使用以下代码查询我的视图
public <T> List<T> findDocuments(ViewQuery query, String bucketAlias, Class<T> clazz) {
// We specifically set reduce false and include docs to retrieve docs
query.reduce(false).includeDocs();
log.debug("Find all documents, query = {}", decode(query));
return getBucket(bucketAlias)
.query(query)
.allRows()
.stream()
.map(row -> fromJsonDocument(row.document(), clazz))
.collect(Collectors.toList());
}
private static <A> A fromJsonDocument(JsonDocument saved, Class<A> clazz) {
log.debug("Retrieved json document -> {}", saved);
A object = fromJson(saved.content(), clazz);
return object;
}
在 fromJsonDocument
方法的日志中,我看到行并不总是按行键排序。通常是,但有时不是。
如果我只是在浏览器沙发基础 GUI 中运行此查询,我总是按预期顺序收到结果。使用异步客户端查询时视图查询结果未排序是 bug 还是预期?不同客户端的行为是什么,而不是 java?
由于您在 Java 客户端中调用的异步性质 + 您使用includeDocs
的事实。
includeDocs
将要做的是,它将为从视图接收的每个文档 ID 编织一个调用get
。因此,当您查看 includeDocs 的异步AsyncViewRow
序列时,您实际上是在查看视图返回的行的组合和整个文档的异步检索。
如果文档检索与上一行的延迟相比略有延迟,则可以对 (row+doc) 排放重新排序。
但大家的好消息是!ViewQuery
中有一个includeDocsOrdered
替代方法,它采用与includeDocs
完全相同的参数,但将确保AsyncViewRow
以视图返回的相同顺序出现。
这是通过急切地触发get
检索来完成的,然后缓冲那些无序到达的检索,以便在不牺牲太多性能的情况下保持原始顺序。
这对于Java客户端非常具体,其使用RxJava
。我什至不确定其他客户是否有includeDocs
的概念......