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、Polygon
和Distance
。
4.2. 衍生查询关键字
除了标准的Spring Data仓库关键字外,Couchbase仓库在涉及两个维度的衍生查询中支持以下关键词:
-
Within
、InWithin
(接受两个定义边界盒的Point
参数) -
Near
、IsNear
(接受一个Point
和一个Distance
参数)
对于涉及更多维度的查询,可以使用的关键词有:
-
Between
(向startRange
和endRange
添加单个数值) -
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项目网站。