Перейти к основному содержимому

Несколько сегментов и запросы пространственного представления в Spring Data Couchbase

· 5 мин. чтения

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 .