【问题标题】:How to get bulk documents/multi gets based on keys in spring data couchbase如何根据 Spring Data Couchbase 中的键获取批量文档/多获取
【发布时间】:2017-04-04 16:18:42
【问题描述】:

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

如果我不想最终使用 Views 或 Nickel 查询,有人可以告诉我我必须使用哪些选项来实现我的最终目标。

另外,为什么spring data couchbase不支持。这是意料之外的事情吗?

【问题讨论】:

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


    【解决方案1】:

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

    它是根据视图对 CRUD 操作和生成的 N1QL 查询的要求来完成的,方法是将 _class 字段上的条件附加到 WHERE 子句。

    当您提供 List 的键时,Couchbase 存储库会简单地重用您必须配置的视图,以便 findAll() 工作,这具有确保键不对应于正确实体的额外好处(即,未被视图索引)将被忽略。

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

    Spring Data Kay 及其对响应式编程的支持很可能也会改变这一格局。

    【讨论】:

      【解决方案2】:

      根据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 是异步的,可以节省额外的往返次数,最终应该会表现得更好!

      【讨论】:

      • 要添加到这个答案,您可以通过CouchbaseTemplate 接口访问bucket,它本身可以从CouchbaseRepository 接口访问,以防万一
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多