1. введение
В этом третьем учебнике по Spring Data Couchbase мы демонстрируем конфигурацию, необходимую для поддержки модели данных Couchbase, охватывающей несколько сегментов, и вводим использование пространственных представлений для запроса многомерных данных.
2. Модель данных
В дополнение к Person entity из нашего первого учебника и Student entity из нашего второго учебника , мы определяем Campus entity для этого учебника:
@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 файл:
org.springframework.data spring-data-couchbase 2.1.1.RELEASE
3.1. Определение компонента ведра
В нашем Введении в Spring Data Couchbase учебнике мы обозначили “baeldung” как имя нашего ведра Couchbase по умолчанию для использования с данными Spring.
Мы будем хранить Кампус сущности в “baeldung2” ведре.
Чтобы использовать второе ведро, мы сначала должны определить @Bean для самого ведра в нашем классе конфигурации Couchbase:
@Bean public Bucket campusBucket() throws Exception { return couchbaseCluster().openBucket("baeldung2", ""); }
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 entity использовал новый шаблон и ведро, в то время как другие классы сущностей будут продолжать использовать шаблон и ведро по умолчанию:
@Override public void configureRepositoryOperationsMapping( RepositoryOperationsMapping baseMapping) { try { baseMapping.mapEntity(Campus.class, campusTemplate()); } catch (Exception e) { //custom Exception handling } }
4. Запрос пространственных или многомерных данных
Couchbase предоставляет встроенную поддержку для выполнения запросов с ограничивающими рамками для двумерных данных, таких как географические данные, с использованием специального типа представления, известного как Пространственное представление .
Запрос ограничивающего прямоугольника-это запрос диапазона,который использует самую юго-западную [x,y] точку окна в качестве параметра начального диапазона и самую северо-западную [x, y] точку в качестве параметра endRange .
Spring Data расширяет собственную функцию запроса ограничивающей рамки Couchbase на запросы, включающие круги и полигоны, используя алгоритм, который стремится устранить ложноположительные совпадения, а также обеспечивает поддержку запросов, включающих более двух измерений.
Spring Data упрощает создание многомерных запросов с помощью набора ключевых слов, которые можно использовать для определения производных запросов в репозиториях Couchbase.
4.1. Поддерживаемые Типы данных
Запросы репозитория Spring Data Couchbase поддерживают типы данных из пакета org.springframework.data.geo , включая Точку, Поле, Круг, полигон, и Расстояние .
4.2. Производные ключевые слова запроса
В дополнение к стандартным ключевым словам хранилища данных Spring репозитории Couchbase поддерживают следующие ключевые слова в производных запросах, включающих два измерения:
- В пределах , В пределах (принимает два точечных параметра, определяющих ограничивающую рамку)
- Рядом , Находится рядом (принимает Точку и Расстояние в качестве параметров)
И следующие ключевые слова могут использоваться для запросов, включающих более двух измерений:
- Между (для добавления одного числового значения как в начальный диапазон , так и в Конечный диапазон )
- GreaterThan, GreaterThanEqual, После (для добавления одного числового значения в начальный диапазон )
- LessThan, LessThanEqual, Перед (для добавления одного числового значения в конечный диапазон )
Вот несколько примеров производных методов запроса, использующих эти ключевые слова:
- findByLocationNear
- findByLocationWithin
- findByLocationNear И Население Больше, Чем
- findByLocationWithin И Площадь Меньше, Чем
- findByLocationNear И Обучение Между
5. Определение репозитория
Методы репозитория, поддерживаемые пространственными представлениями, должны быть украшены аннотацией @Dimensional , которая указывает имя проектного документа, имя представления и количество измерений, используемых для определения ключа представления (по умолчанию 2, если не указано иное).
5.1. Интерфейс Репозитория Кампуса
Здесь, в нашем интерфейсе CampusRepository , мы объявляем два метода — один, который использует традиционные ключевые слова данных Spring, поддерживаемые представлением MapReduce, и другой, который использует ключевые слова данных Spring, поддерживаемые пространственным представлением:
public interface CampusRepository extends CrudRepository{ @View(designDocument="campus", viewName="byName") Set findByName(String name); @Dimensional(dimensions=2, designDocument="campus_spatial", spatialViewName="byLocation") Set findByLocationNear(Point point, Distance distance); }
5.2. Пространственные представления
Пространственные представления записываются как функции JavaScript, во многом как представления MapReduce. В отличие от представлений MapReduce, которые состоят как из функции map , так и из функции reduce , пространственные представления состоят только из функции spatial и не могут сосуществовать в том же проектном документе Couchbase, что и представления MapReduce.
Для наших объектов 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
Чтобы обеспечить полную поддержку нашего репозитория, мы должны создать проектный документ с именем “кампус” , содержащий два представления MapReduce: “все” и “byName” .
Вот функция карты для представления “все” :
function (doc, meta) { if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus") { emit(meta.id, null); } }
А вот функция карты для “byName” view:
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 project.