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


我使用 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 方法的日志中,我看到行并不总是按行键排序。通常是,但有时不是。

如果我只是在浏览器沙发基础 GUI 中运行此查询,我总是按预期顺序收到结果。使用异步客户端查询时视图查询结果未排序是 bug 还是预期?不同客户端的行为是什么,而不是 java?

这是

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

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

如果文档检索与上一行的延迟相比略有延迟,则可以对 (row+doc) 排放重新排序。

但大家的好消息是!ViewQuery中有一个includeDocsOrdered替代方法,它采用与includeDocs完全相同的参数,但将确保AsyncViewRow以视图返回的相同顺序出现。

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

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

最新更新