1. 序章

Spring Data Couchbaseに関するこの3番目のチュートリアルでは、複数のバケットにまたがるCouchbaseデータモデルをサポートするために必要な構成を示し、多次元データをクエリするための空間ビューの使用を紹介します。

2. データ・モデル

最初のチュートリアルPersonエンティティと2番目のチュートリアルStudentエンティティに加えて、キャンパスを定義します。このチュートリアルのエンティティ:

@Document
public class Campus {
    @Id
    private String id;

    @Field
    @NotNull
    private String name;

    @Field
    @NotNull
    private Point location;

    // standard getters and setters
}

3. 複数のCouchbaseバケットのJava構成

プロジェクトで複数のバケットを使用するには、Spring Data Couchbaseモジュールのバージョン2.0.0以降を使用する必要があります。また、XMLベースの構成は単一の構成のみをサポートするため、Javaベースの構成を使用する必要があります。バケットシナリオ。

Maven pom.xmlファイルに含める依存関係は次のとおりです。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-couchbase</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

3.1. バケットビーンの定義

SpringデータCouchbaseの概要チュートリアルでは、Springデータで使用するデフォルトのCouchbaseバケットの名前として「baeldung」を指定しました。

Campusエンティティを「baeldung2」バケットに保存します。

2番目のバケットを利用するには、まず、Couchbase構成クラスでバケット自体に@Beanを定義する必要があります。

@Bean
public Bucket campusBucket() throws Exception {
    return couchbaseCluster().openBucket("baeldung2", "");
}

3.2. テンプレートBeanの構成

次に、このバケットで使用されるCouchbaseTemplate@Beanを定義します。

@Bean
public CouchbaseTemplate campusTemplate() throws Exception {
    CouchbaseTemplate template = new CouchbaseTemplate(
      couchbaseClusterInfo(), campusBucket(),
      mappingCouchbaseConverter(), translationService());
    template.setDefaultConsistency(getDefaultConsistency());
    return template;
}

3.3. リポジトリのマッピング

最後に、 Campus エンティティクラスが新しいテンプレートとバケットを使用し、他のエンティティクラスが引き続きデフォルトのテンプレートとバケットを使用するように、Couchbaseリポジトリ操作のカスタムマッピングを定義します。

@Override
public void configureRepositoryOperationsMapping(
  RepositoryOperationsMapping baseMapping) {
    try {
        baseMapping.mapEntity(Campus.class, campusTemplate());
    } catch (Exception e) {
        //custom Exception handling
    }
}

4. 空間データまたは多次元データのクエリ

Couchbaseは、 Spatial view と呼ばれる特殊なタイプのビューを使用して、地理データなどの2次元データに対してバウンディングボックスクエリを実行するためのネイティブサポートを提供します。

バウンディングボックスクエリは、ボックスの南西端の [x、y]ポイントをstartRange パラメータとして使用し、北西端の [x、 y]ポイントをendRangeパラメーターとして指定します。

Springデータは、誤検知の一致を排除しようとするアルゴリズムを使用して、Couchbaseのネイティブバウンディングボックスクエリ機能を円とポリゴンを含むクエリに拡張し、3つ以上の次元を含むクエリのサポートも提供します。

Spring Dataは、Couchbaseリポジトリで派生クエリを定義するために使用できる一連のキーワードを通じて、多次元クエリの作成を簡素化します。

4.1. サポートされているデータ型

Spring Data Couchbaseリポジトリクエリは、 org.springframework.data.geo パッケージのデータ型をサポートします。これには、 Point、Box、Circle、Polygon、Distanceが含まれます。

4.2. 派生クエリキーワード

標準のSpringDataリポジトリキーワードに加えて、Couchbaseリポジトリは、2つのディメンションを含む派生クエリで次のキーワードをサポートします。

  • Within InWithin (バウンディングボックスを定義する2つの Point パラメーターを取ります)
  • Near IsNear PointおよびDistanceをパラメーターとして使用)

また、次のキーワードは、3つ以上のディメンションを含むクエリに使用できます。

  • Between startRangeendRangeの両方に単一の数値を追加するため)
  • GreaterThan、GreaterThanEqual、After startRange に単一の数値を追加するため)
  • LessThan、LessThanEqual、Before endRange に単一の数値を追加するため)

これらのキーワードを使用した派生クエリメソッドの例を次に示します。

  • findByLocationNear
  • findByLocationWithin
  • findByLocationNearAndPopulationGreaterThan
  • findByLocationWithinAndAreaLessThan
  • findByLocationNearAndTuitionBetween

5. リポジトリの定義

空間ビューに基づくリポジトリメソッドは、 @Dimensional アノテーションで装飾する必要があります。このアノテーションは、デザインドキュメント名、ビュー名、およびビューのキーを定義するために使用されるディメンション数を指定します(特に指定されていない場合はデフォルト2)。

5.1. CampusRespositoryインターフェイス

ここで、 CampusRepository インターフェースで、2つのメソッドを宣言します。1つはMapReduceビューに基づく従来のSpring Dataキーワードを使用し、もう1つはSpatialビューに基づく次元SpringDataキーワードを使用します。

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. 空間ビュー

空間ビューは、MapReduceビューと同様に、JavaScript関数として記述されます。 map関数とreduce関数の両方で構成されるMapReduceビューとは異なり、空間ビューは Spatial 関数のみで構成され、同じCouchbaseに共存できない場合がありますMapReduceビューとしてドキュメントを設計します。

Campus エンティティの場合、次の関数を使用して、「byLocation」という名前の空間ビューを含む「campus_spatial」という名前のデザインドキュメントを作成します。

function (doc) {
  if (doc.location &&
      doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {
    emit([doc.location.x, doc.location.y], null);
  }
}

この例が示すように、空間ビュー関数を作成する場合、emit関数呼び出しで使用されるキーは2つ以上の値の配列である必要があります。

5.3. MapReduceビュー

リポジトリを完全にサポートするには、2つのMapReduceビュー「all」「byName」を含む「campus」という名前のデザインドキュメントを作成する必要があります。

「すべて」ビューのマップ関数は次のとおりです。

function (doc, meta) {
  if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus") {    
    emit(meta.id, null);
  }
}

そして、これが“ byName”ビューのマップ関数です。

function (doc, meta) {
  if(doc._class == "com.baeldung.spring.data.couchbase.model.Campus" &&
     doc.name) {    
    emit(doc.name, null);
  }
}

6. 結論

複数のバケットの使用をサポートするようにSpringDataCouchbaseプロジェクトを構成する方法と、リポジトリの抽象化を使用して多次元データに対して空間ビュークエリを作成する方法を示しました。

このチュートリアルの完全なソースコードは、githubプロジェクトで表示できます。

Spring Data Couchbaseの詳細については、公式の Spring DataCouchbaseプロジェクトサイトにアクセスしてください。