如何根据spring数据基础中的键获取批量文档/ multi gets

时间:2017-04-04 16:18:43

标签: java spring spring-boot couchbase spring-data-couchbase

我一直在尝试根据id列表获取批量文档。但由于某些原因,我没有在CRUD Repo中看到一个方法可以给我这些数据。我能够找到方法名称“FindAll(List)”,但这似乎仅适用于名为“all”的视图,我不想为简单查找引入视图(主要应该是一个功能of couchbase)。

如果我不想最终使用视图或镍查询,有人可以让我知道我有什么选择来实现我的最终目标。

另外,为什么Spring数据沙发库不支持它。这是不是预料到的事情吗?

2 个答案:

答案 0 :(得分:1)

Repository需要能够findAll()负责保存的文档。问题是,在Couchbase中,您可以将所有类型的文档保存在同一个存储桶中,因此存储库需要一种仅隔离与其实体类型匹配的文档的方法。

完成了View for CRUD操作的要求,以及通过在_class字段上附加WHERE子句的条件来生成N1QL查询。

当您提供List个密钥时,Couchbase存储库只需重新使用您必须配置的视图,以便findAll()正常工作,这样可以确保密钥与正确的实体不对应(也就是说,没有被视图索引)将被忽略。

这就是说我认为删除视图要求的路线图......(但这取决于Couchbase团队。可能会提出一个问题以获得更明确的答案)。

Spring Data Kay及其对Reactive Programming的支持很可能也会改变现状。

答案 1 :(得分:0)

根据documentation,使用RxJava,您可以使用有效的批处理。

代码示例

bucket.async()
        .query(N1qlQuery.simple("SELECT meta().id as id FROM bucket"))
        .doOnNext(res -> res.info().map(N1qlMetrics::elapsedTime).
         forEach(t -> System.out.println("time elapsed"+t)))
        .flatMap(AsyncN1qlQueryResult::rows)
        .flatMap(row -> 
        bucket.async().
        get(row.value().getString("id")))
        .map(JsonDocument::content).
        toList()
        .toBlocking()
        .single();

RxJava是异步的,可以节省额外的往返次数,最终会有更好的表现!