Spring Data Couchbaseの複数のバケットと空間ビュークエリ

Spring Data Couchbaseの複数のバケットと空間ビュークエリ

1. 前書き

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

2. データ・モデル

our first tutorialPersonエンティティとour second tutorialStudentエンティティに加えて、このチュートリアルではCampusエンティティを定義します。

@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構成

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

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


    org.springframework.data
    spring-data-couchbase
    2.1.1.RELEASE

3.1. バケットBeanの定義

Introduction to Spring Data Couchbaseチュートリアルでは、Spring Dataで使用するデフォルトのCouchbaseバケットの名前として“example”を指定しました。

Campusエンティティを“example2”バケットに格納します。

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

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

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. リポジトリのマッピング

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

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

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

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

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

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

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

  • WithinInWithin(バウンディングボックスを定義する2つのPointパラメータを取ります)

  • NearIsNear(パラメーターとしてPointおよびDistanceを取ります)

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

  • BetweenstartRangeendRangeの両方に単一の数値を追加するため)

  • GreaterThan, GreaterThanEqual, AfterstartRangeに単一の数値を追加するため)

  • LessThan, LessThanEqual, BeforeendRangeに単一の数値を追加するため)

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

  • 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 {

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

空間ビューは、MapReduceビューによく似たJavaScript関数として記述されています。 map関数とreduce関数の両方で構成されるMapReduceビューとは異なり、空間ビューはspatial関数のみで構成され、MapReduceビューと同じCouchbaseデザインドキュメントに共存することはできません。

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

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

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

5.3. MapReduceビュー

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

“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プロジェクトサイトにアクセスしてください。