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
...
的概念
我使用 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
...