Couchbase被动客户端是否保证视图查询结果中的行顺序

时间:2016-04-23 19:51:08

标签: couchbase rx-java couchbase-view couchbase-java-api

我将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?

1 个答案:

答案 0 :(得分:1)

这是由于您在Java客户端中调用的异步性质+您使用includeDocs的事实。

includeDocs将要做的是,它会针对从视图收到的每个文档ID调用get。因此,当您使用includeDocs查看AsyncViewRow的异步序列时,您实际上是在查看视图返回的行的组合以及整个文档的异步检索。

如果文档检索与前一行的延迟相比有一点延迟,则可以重新排序(行+ doc)发射。

但是大家好消息! includeDocsOrdered 中有一个ViewQuery替代版,其参数与includeDocs完全相同,但会确保AsyncViewRow按照视图返回的相同顺序排列

这是通过急切地触发get检索然后缓冲那些无序到达的那些来完成的,以便在不牺牲太多性能的情况下保持原始顺序。

这对Java客户端非常具体,使用RxJava。我甚至不确定其他客户是否有includeDocs ...

的概念