我将Couchbase 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
方法的日志中,我看到行并不总是按行键排序。通常他们是,但有时他们不是。
如果我只是在浏览器couchbase GUI中运行此查询,我总是按预期顺序收到结果。在使用异步客户端查询时,是否存在错误或预期视图查询结果未排序? 不同客户端的行为是什么,而不是java?
答案 0 :(得分:1)
这是由于您在Java客户端中调用的异步性质+您使用includeDocs
的事实。
includeDocs
将要做的是,它会针对从视图收到的每个文档ID调用get
。因此,当您使用includeDocs查看AsyncViewRow
的异步序列时,您实际上是在查看视图返回的行的组合以及整个文档的异步检索。
如果文档检索与前一行的延迟相比有一点延迟,则可以重新排序(行+ doc)发射。
但是大家好消息! includeDocsOrdered
中有一个ViewQuery
替代版,其参数与includeDocs
完全相同,但会确保AsyncViewRow
按照视图返回的相同顺序排列
这是通过急切地触发get
检索然后缓冲那些无序到达的那些来完成的,以便在不牺牲太多性能的情况下保持原始顺序。
这对Java客户端非常具体,使用RxJava
。我甚至不确定其他客户是否有includeDocs
...