1

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

4

1 回答 1

1

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

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

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

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

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

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

于 2016-04-25T10:42:32.297 回答