我想从Couchbase存储桶中异步读取许多文档。这是我的代码:
JsonDocument student = bucketStudent.get(studentID);
问题在于包含大量学生ID的大型数据文件,由于这些学生ID会调用get()
方法,因此获取这些学生ID的所有文档将花费很长时间。是否可以有一个学生ID列表作为输入并返回学生列表的输出,而不是为每个学生ID获得单个文档?
答案 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 提供了执行多重获取的能力。它有两种口味
异步批量获取
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 .