Рубрики
Без рубрики

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

Узнайте, как настроить Spring Data Couchbase для поддержки нескольких сегментов и использовать репозиторий для написания запросов пространственного представления к многомерным данным.

Автор оригинала: baeldung.

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.