Couchbase 反应式客户端是否保证视图查询结果中的行顺序

Do Couchbase reactive clients guarantee order of rows in view query result

我使用 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?

这是因为您在 Java 客户端中调用的异步性质 + 您使用了 includeDocs

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

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

不过大家好消息! ViewQuery 中有一个 includeDocsOrdered 替代方案,它采用与 includeDocs 完全相同的参数,但将确保 AsyncViewRow 以与查看。

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

这是 Java 客户端特有的,它使用 RxJava。我什至不确定其他客户是否有 includeDocs...

的概念