3. 多个Couchbase桶的配置与多维数据查询

在Spring Data Couchbase的第三个教程中,我们将展示如何配置支持跨越多个桶的数据模型,并介绍如何使用空间视图查询多维度数据。

2. 数据模型

除了第一个教程中的Person实体和第二个教程中的Student实体,我们在此教程中定义了一个Campus实体:

@Document
public class Campus {
    @Id
    private String id;

    @Field
    @NotNull
    private String name;

    @Field
    @NotNull
    private Point location;

    // standard getters and setters
}

3. Java配置多个Couchbase桶

要在项目中使用多个桶,你需要使用Spring Data Couchbase模块的2.0.0或更高版本,并且需要使用Java配置,因为基于XML的配置仅支持单桶场景。

在Maven的pom.xml文件中,我们需要包含以下依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-couchbase</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

3.1. 定义桶bean

Spring Data Couchbase入门教程中,我们将“baeldung”指定为我们默认的Couchbase桶,用于与Spring Data集成。

我们将存储Campus实体在名为“baeldung2”的桶中。

为了使用新的桶,首先需要在Couchbase配置类中定义一个桶的@Bean

@Bean
public Bucket campusBucket() throws Exception {
    return couchbaseCluster().openBucket("baeldung2", "");
}

3.2. 配置模板bean

接下来,我们定义一个用于新桶的CouchbaseTemplate @Bean

@Bean
public CouchbaseTemplate campusTemplate() throws Exception {
    CouchbaseTemplate template = new CouchbaseTemplate(
      couchbaseClusterInfo(), campusBucket(),
      mappingCouchbaseConverter(), translationService());
    template.setDefaultConsistency(getDefaultConsistency());
    return template;
}

3.3. 映射仓库

最后,我们定义一个自定义的Couchbase仓库操作映射,以便Campus实体类将使用新的模板和桶,而其他实体类将继续使用默认的模板和桶:

@Override
public void configureRepositoryOperationsMapping(
  RepositoryOperationsMapping baseMapping) {
    try {
        baseMapping.mapEntity(Campus.class, campusTemplate());
    } catch (Exception e) {
        //custom Exception handling
    }
}

4. 查询空间或多维度数据

Couchbase提供了对二维数据(如地理数据)的原生支持,通过名为“空间视图”的特殊类型视图来执行边界盒查询。

边界盒查询是一种范围查询,使用盒子的西南角的[x,y]点作为startRange参数,西北角的[x,y]点作为endRange参数。

Spring Data扩展了Couchbase的原生边界盒查询功能,支持涉及圆和多边形的查询,并通过算法消除假阳性匹配。它还支持涉及更多维度的查询。

Spring Data通过一组关键词简化了多维度查询的创建,这些关键词可用于在Couchbase仓库中定义衍生查询。

4.1. 支持的数据类型

Spring Data Couchbase仓库查询支持org.springframework.data.geo包中的数据类型,包括Point、Box、Circle、PolygonDistance

4.2. 衍生查询关键字

除了标准的Spring Data仓库关键字外,Couchbase仓库在涉及两个维度的衍生查询中支持以下关键词:

  • WithinInWithin(接受两个定义边界盒的Point参数)
  • NearIsNear(接受一个Point和一个Distance参数)

对于涉及更多维度的查询,可以使用的关键词有:

  • Between(向startRangeendRange添加单个数值)
  • GreaterThan、GreaterThanEqual、After(向startRange添加单个数值)
  • LessThan、LessThanEqual、Before(向endRange添加单个数值)

以下是使用这些关键词的衍生查询方法示例:

  • findByLocationNear
  • findByLocationWithin
  • findByLocationNearAndPopulationGreaterThan
  • findByLocationWithinAndAreaLessThan
  • findByLocationNearAndTuitionBetween

5. 定义仓库

由空间视图支持的仓库方法必须使用@Dimensional注解进行装饰,该注解指定了设计文档名称、视图名称以及定义视图键(默认为2,如果没有明确指定)的维度数。

5.1. CampusRepository 接口

在我们的CampusRepository接口中,我们声明了两个方法:一个使用传统的Spring Data关键字,由MapReduce视图支持,另一个使用多维度Spring Data关键字,由空间视图支持:

public interface CampusRepository extends CrudRepository<Campus, String> {

    @View(designDocument="campus", viewName="byName")
    Set<Campus> findByName(String name);

    @Dimensional(dimensions=2, designDocument="campus_spatial",
      spatialViewName="byLocation")
    Set<Campus> findByLocationNear(Point point, Distance distance);
}

5.2. 空间视图

空间视图是用JavaScript函数编写的,就像MapReduce视图一样。与MapReduce视图由map函数和reduce函数组成不同,空间视图只包含一个spatial函数,且不能与MapReduce视图在同一Couchbase设计文档中存在。

对于Campus实体,我们将创建一个名为“campus_spatial”的设计文档,其中包含名为“byLocation”的空间视图,其函数如下:

function (doc) {
  if (doc.location &&
      doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {
    emit([doc.location.x, doc.location.y], null);
  }
}

这个例子表明,当你编写空间视图函数时,emit函数调用中的键必须是一个包含两个或更多值的数组。

5.3. MapReduce 视图

为了全面支持我们的仓库,我们需要创建一个名为“campus”的设计文档,其中包含两个MapReduce视图:“all”和“byName”。

这是“all”视图的map函数:

function (doc, meta) {
  if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {    
    emit(meta.id, null);
  }
}

这是“byName”视图的map函数:

function (doc, meta) {
  if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus" &&
     doc.name) {    
    emit(doc.name, null);
  }
}

6. 结论

我们展示了如何配置你的Spring Data Couchbase项目以支持多个桶的使用,并演示了如何使用仓库抽象编写针对多维度数据的空间视图查询。

你可以在GitHub项目中查看本教程的完整源代码。

要了解更多关于Spring Data Couchbase的信息,请访问官方Spring Data Couchbase项目网站。


« 上一篇: Spring中Bean的作用域
» 下一篇: WireMock简介