1. Введение
В этом третьем руководстве по Spring Data Couchbase мы демонстрируем конфигурацию, необходимую для поддержки модели данных 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
Чтобы использовать несколько сегментов в своем проекте, вам потребуется версия 2.0.0 или более поздняя версия модуля Spring Data Couchbase, и вам потребуется использовать конфигурацию на основе 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. Определение компонента Bucket
В нашем руководстве « Введение в Spring Data Couchbase » мы обозначили «foreach»
как имя нашей корзины Couchbase по умолчанию для использования с Spring Data.
Мы будем хранить объекты Campus в
корзине «foreach2»
.
Чтобы использовать второе ведро, мы сначала должны определить @Bean
для самого ведра
в нашем классе конфигурации Couchbase:
@Bean
public Bucket campusBucket() throws Exception {
return couchbaseCluster().openBucket("foreach2", "");
}
3.2. Настройка компонента шаблона
Затем мы определяем @Bean
для CouchbaseTemplate
, который будет использоваться с этим сегментом:
@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
в качестве параметров)
И следующие ключевые слова могут использоваться для запросов, включающих более двух измерений:
Между
(для добавления одного числового значения как кstartRange
, так ик endRange
)GreaterThan, GreaterThanEqual, After
(для добавления одного числового значения вstartRange
)LessThan, LessThanEqual, Before
(для добавления одного числового значения вendRange
)
Вот несколько примеров производных методов запроса, использующих эти ключевые слова:
найтиByLocationNear
найти по местоположению в пределах
findByLocationNearAndPopulationGreaterThan
findByLocationWithinAndAreaLessThan
findByLocationNearAndTuitionBetween
5. Определение репозитория
Методы репозитория, поддерживаемые пространственными представлениями, должны быть дополнены аннотацией @Dimensional
, которая указывает имя проектного документа, имя представления и количество измерений, используемых для определения ключа представления (по умолчанию 2, если не указано иное).
5.1. Интерфейс CampusRespository
Здесь, в нашем интерфейсе 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, которые состоят как из функции карты , так и из функции
уменьшения
, представления Spatial состоят только из пространственной
функции и могут не сосуществовать в одном и том же проектном документе Couchbase с представлениями MapReduce.
Для объектов Campus
мы создадим проектный документ с именем «campus_spatial»
, содержащий пространственное представление с именем «byLocation»
со следующей функцией:
function (doc) {
if (doc.location &&
doc._class == "com.foreach.spring.data.couchbase.model.Campus") {
emit([doc.location.x, doc.location.y], null);
}
}
Как показывает этот пример, когда вы пишете функцию пространственного представления, ключ, используемый в вызове функции emit
, должен быть массивом из двух или более значений.
5.3. Просмотры MapReduce
Чтобы обеспечить полную поддержку нашего репозитория, мы должны создать проектный документ с именем «campus»
, содержащий два представления MapReduce: «all»
и «byName»
.
Вот функция карты для просмотра «все»
:
function (doc, meta) {
if(doc._class == "com.foreach.spring.data.couchbase.model.Campus") {
emit(meta.id, null);
}
}
А вот функция карты для представления «byName»
:
function (doc, meta) {
if(doc._class == "com.foreach.spring.data.couchbase.model.Campus" &&
doc.name) {
emit(doc.name, null);
}
}
6. Заключение
Мы показали, как настроить ваш проект Spring Data Couchbase для поддержки использования нескольких сегментов, и мы продемонстрировали, как использовать абстракцию репозитория для написания запросов пространственного представления к многомерным данным.
Вы можете просмотреть полный исходный код этого туториала в проекте github .
Чтобы узнать больше о Spring Data Couchbase, посетите официальный сайт проекта Spring Data Couchbase .