Несколько блоков и запросов пространственного представления в Spring Couchbase
1. Вступление
В этом третьем руководстве по Spring Data Couchbase мы продемонстрируем конфигурацию, необходимую для поддержки модели данных Couchbase, охватывающей несколько сегментов, и представим использование пространственных представлений для запроса многомерных данных.
2. Модель данных
В дополнение к сущностиPerson изour first tutorial иStudent изour second tutorial, мы определяем сущность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 поддерживает только одно ведущие сценарии.
Вот зависимость, которую мы включаем в наш файл Mavenpom.xml:
org.springframework.data
spring-data-couchbase
2.1.1.RELEASE
3.1. Определение Bucket Bean
В нашем руководствеIntroduction to Spring Data Couchbase мы обозначили“example” как имя нашей корзины Couchbase по умолчанию для использования с Spring Data.
Мы будем хранитьCampus объектов в корзине“example2”.
Чтобы использовать вторую корзину, мы сначала должны определить@Bean для самогоBucket в нашем классе конфигурации Couchbase:
@Bean
public Bucket campusBucket() throws Exception {
return couchbaseCluster().openBucket("example2", "");
}
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 предоставляет встроенную поддержку для выполнения запросов ограничивающего прямоугольника к двумерным данным, таким как географические данные, с использованием специального типа представления, известного какSpatial view.
Запрос ограничивающего прямоугольника - это запрос диапазона, который использует самую юго-западную точку[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. Интерфейс CampusRespository
Здесь, в нашем интерфейсеCampusRepository, мы объявляем два метода - один, который использует традиционные ключевые слова Spring Data, поддерживаемый представлением MapReduce, и другой, который использует ключевые слова размерных Spring Data, поддерживаемых пространственным представлением:
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 == "org.example.spring.data.couchbase.model.Campus") {
emit([doc.location.x, doc.location.y], null);
}
}
Как показывает этот пример, когда вы пишете функцию пространственного представления, ключ, используемый в вызове функцииemit, должен быть массивом из двух или более значений.
5.3. MapReduce Просмотры
Чтобы обеспечить полную поддержку нашего репозитория, мы должны создать проектный документ с именем“campus”, содержащий два представления MapReduce:“all” и“byName”.
Вот функция карты для представления“all”:
function (doc, meta) {
if(doc._class == "org.example.spring.data.couchbase.model.Campus") {
emit(meta.id, null);
}
}
А вот функция карты для представления“byName”:
function (doc, meta) {
if(doc._class == "org.example.spring.data.couchbase.model.Campus" &&
doc.name) {
emit(doc.name, null);
}
}
6. Заключение
Мы показали, как настроить ваш проект Spring Data Couchbase для поддержки использования нескольких сегментов, и продемонстрировали, как использовать абстракцию репозитория для написания запросов пространственного представления к многомерным данным.
Вы можете просмотреть полный исходный код этого руководства вthe github project.
Чтобы узнать больше о Spring Data Couchbase, посетите официальный сайт проектаSpring Data Couchbase.