批量读取Couchbase文档

时间:2018-08-13 11:01:31

标签: java rx-java couchbase

我想从Couchbase存储桶中异步读取许多文档。这是我的代码:

JsonDocument student = bucketStudent.get(studentID);

问题在于包含大量学生ID的大型数据文件,由于这些学生ID会调用get()方法,因此获取这些学生ID的所有文档将花费很长时间。是否可以有一个学生ID列表作为输入并返回学生列表的输出,而不是为每个学生ID获得单个文档?

4 个答案:

答案 0 :(得分:2)

AFAIK沙发式SDK不具有用于批量get操作的本机功能。

node.js SDK有一个getMulti方法,但是它基本上是一个数组的迭代,然后为每个元素触发get()

在我的应用程序中发现,key-value方法仍然比主索引上的SELECT *更快,但是N1QL查询非常接近(在benchbase 5.x上)。

一个简单的提示:如果您要提取很多ID,并且决定使用N1QL查询,请尝试将该列表拆分成较小的块。它加快了查询速度,您实际上可以更好地管理错误,避免出现一些讨厌的超时。

答案 1 :(得分:1)

如果您正在运行查询节点,则可以为此使用N1QL。您的查询将如下所示:

SELECT * FROM myBucket USE KEYS ["key1", "key2", "key3"]

实际上,您可能会将字符串数组作为参数传递,如下所示:

SELECT * FROM myBucket USE KEYS ?

您将需要为存储桶添加主索引,否则类似的查询将无法正常工作。

答案 2 :(得分:1)

默认情况下,Couchbase Java SDK不支持使用文档ID检索多个文档。为此,您需要使用如下的N1QL查询

SELECT S.* FROM Student S USE KEYS ["StudentID1", "StudentID2", "StudentID3"]

,它将返回具有给定ID的文档数组。使用com.couchbase.client.java.query.N1qlQuery构造查询,然后使用以下任一方法执行

如果您使用的是 Spring's CouchbaseTemplate ,则可以使用以下内容

List<T> findByN1QL(com.couchbase.client.java.query.N1qlQuery n1ql,
                          Class<T> entityClass)

如果您使用的是 Couchbase的Java SDK ,则可以使用以下

N1qlQueryResult query(N1qlQuery query)

请注意,您需要在存储桶上使用index来运行N1QL查询。

答案 3 :(得分:0)

现在可以了。 java sdk 提供了执行多重获取的能力。它有两种口味

  1. 异步批量获取

  2. N1Q1 查询。 不适用于二进制文档

Couchbase 文档建议使用异步批量获取,但这对响应式 Java 客户端有额外的依赖性。您可以查看官方文档 here

有几个教程解释了用法。 link .

这是使用 java sdk 3.2 的示例 get 的样子

    List<String> docsToFetch = Arrays.asList("airline_112", "airline_1191", "airline_1203");

    Map<String, GetResult> successfulResults = new ConcurrentHashMap<>();
    Map<String, Throwable> erroredResults = new ConcurrentHashMap<>();

    Flux.fromIterable(docsToFetch).flatMap(key -> reactiveCollection.get(key).onErrorResume(e -> {
        erroredResults.put(key, e);
        return Mono.empty();
    }).doOnNext(getResult -> successfulResults.put(key, getResult))).last().block();

source .