Mehrere Buckets und Abfragen in räumlicher Ansicht in Spring Data Couchbase

Mehrere Buckets und räumliche Ansichtsabfragen in Spring Data Couchbase

1. Einführung

In diesem dritten Lernprogramm zu Spring Data Couchbase zeigen wir die Konfiguration, die zur Unterstützung eines Couchbase-Datenmodells erforderlich ist, das mehrere Buckets umfasst, und wir führen die Verwendung von räumlichen Ansichten zum Abfragen mehrdimensionaler Daten ein.

2. Datenmodell

Zusätzlich zur EntitätPerson ausour first tutorial und der EntitätStudent ausour second tutorial definieren wir für dieses Lernprogramm eine EntitätCampus:

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

    @Field
    @NotNull
    private String name;

    @Field
    @NotNull
    private Point location;

    // standard getters and setters
}

3. Java-Konfiguration für mehrere Couchbase-Buckets

Um mehrere Buckets in Ihrem Projekt verwenden zu können, müssen Sie Version 2.0.0 oder höher des Spring Data Couchbase-Moduls verwenden und eine Java-basierte Konfiguration verwenden, da die XML-basierte Konfiguration nur Single- Bucket-Szenarien.

Hier ist die Abhängigkeit, die wir in unsere Mavenpom.xml-Datei aufnehmen:


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

3.1. Bucket Bean definieren

In unserem Lernprogramm fürIntroduction to Spring Data Couchbasehaben wir“example” als Namen für unseren Standard-Couchbase-Bucket zur Verwendung mit Spring Data festgelegt.

Wir werden die Entitäten vonCampusim Bucket von“example2”peichern.

Um einen zweiten Bucket zu verwenden, müssen wir zuerst ein@Bean für dasBucket selbst in unserer Couchbase-Konfigurationsklasse definieren:

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

3.2. Konfigurieren der Template Bean

Als nächstes definieren wir@Bean fürCouchbaseTemplate, die mit diesem Bucket verwendet werden sollen:

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

3.3. Zuordnen der Repositorys

Schließlich definieren wir eine benutzerdefinierte Zuordnung von Couchbase-Repository-Operationen, sodass die EntitätsklasseCampusdie neue Vorlage und den neuen Bucket verwendet, während andere Entitätsklassen weiterhin die Standardvorlage und den Bucket verwenden:

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

4. Abfragen von räumlichen oder mehrdimensionalen Daten

Couchbase bietet native Unterstützung für die Ausführung von Bounding-Box-Abfragen für zweidimensionale Daten, z. B. geografische Daten, unter Verwendung eines speziellen Ansichtstyps, der alsSpatial view bezeichnet wird.

Eine Begrenzungsrahmenabfrage ist eine Bereichsabfrage, die den südwestlichsten[x,y]-Punkt des Felds alsstartRange-Parameter und den nordwestlichsten[x,y]-Punkt alsendRange-Parameter verwendet .

Spring Data erweitert die native Bounding-Box-Abfragefunktion von Couchbase auf Abfragen mit Kreisen und Polygonen. Dabei wird ein Algorithmus verwendet, mit dem falsch positive Übereinstimmungen beseitigt werden sollen. Außerdem werden Abfragen mit mehr als zwei Dimensionen unterstützt.

Spring Data vereinfacht die Erstellung mehrdimensionaler Abfragen durch eine Reihe von Schlüsselwörtern, mit denen abgeleitete Abfragen in Couchbase-Repositorys definiert werden können.

4.1. Unterstützte Datentypen

Spring Data Couchbase-Repository-Abfragen unterstützen Datentypen aus dem Paketorg.springframework.data.geo, einschließlichPoint, Box, Circle, Polygon, undDistance.

4.2. Abgeleitete Abfrage-Schlüsselwörter

Zusätzlich zu den Standardschlüsselwörtern für das Spring Data-Repository unterstützen Couchbase-Repositorys die folgenden Schlüsselwörter in abgeleiteten Abfragen mit zwei Dimensionen:

  • Within,InWithin (benötigt zweiPoint Parameter, die einen Begrenzungsrahmen definieren)

  • Near,IsNear (nimmtPoint undDistance als Parameter)

Die folgenden Schlüsselwörter können für Abfragen mit mehr als zwei Dimensionen verwendet werden:

  • Between (zum Hinzufügen eines einzelnen numerischen Werts zustartRange undendRange)

  • GreaterThan, GreaterThanEqual, After (zum Hinzufügen eines einzelnen numerischen Werts zustartRange)

  • LessThan, LessThanEqual, Before (zum Hinzufügen eines einzelnen numerischen Werts zuendRange)

Hier einige Beispiele für abgeleitete Abfragemethoden, die diese Schlüsselwörter verwenden:

  • findByLocationNear

  • findByLocationWithin

  • findByLocationNearAndPopulationGreaterThan

  • findByLocationWithinAndAreaLessThan

  • findByLocationNearAndTuitionBetween

5. Repository definieren

Repository-Methoden, die von räumlichen Ansichten unterstützt werden, müssen mit der Annotation@Dimensionalversehen sein, die den Namen des Entwurfsdokuments, den Namen der Ansicht und die Anzahl der Dimensionen angibt, die zum Definieren des Schlüssels der Ansicht verwendet werden (Standard 2, falls nicht anders angegeben).

5.1. Die CampusRespository-Schnittstelle

Hier in unsererCampusRepository-Schnittstelle deklarieren wir zwei Methoden - eine, die herkömmliche Spring Data-Schlüsselwörter verwendet, die von einer MapReduce-Ansicht unterstützt werden, und eine, die dimensionale Spring Data-Schlüsselwörter verwendet, die von einer räumlichen Ansicht unterstützt werden:

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. Raumansichten

Räumliche Ansichten werden ähnlich wie MapReduce-Ansichten als JavaScript-Funktionen geschrieben. Im Gegensatz zu MapReduce-Ansichten, die sowohl aus einermap-Funktion als auch aus einerreduce-Funktion bestehen, bestehen räumliche Ansichten nur aus einerspatial-Funktion und können möglicherweise nicht im selben Couchbase-Entwurfsdokument wie MapReduce-Ansichten vorhanden sein.

Für unsereCampus-Entitäten erstellen wir ein Entwurfsdokument mit dem Namen“campus_spatial”, das eine räumliche Ansicht mit dem Namen“byLocation” mit der folgenden Funktion enthält:

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

Wie dieses Beispiel zeigt, muss beim Schreiben einer räumlichen Ansichtsfunktion der im Funktionsaufrufemitverwendete Schlüssel ein Array mit zwei oder mehr Werten sein.

5.3. MapReduce-Ansichten

Um unser Repository vollständig zu unterstützen, müssen wir ein Designdokument mit dem Namen“campus” erstellen, das zwei MapReduce-Ansichten enthält:“all” und“byName”.

Hier ist die Kartenfunktion für die Ansicht von“all”:

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

Und hier ist die Kartenfunktion für die Ansicht von“byName”:

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

6. Fazit

Wir haben gezeigt, wie Sie Ihr Spring Data Couchbase-Projekt so konfigurieren, dass es die Verwendung mehrerer Buckets unterstützt, und wir haben gezeigt, wie Sie die Repository-Abstraktion verwenden, um räumliche Ansichtsabfragen für mehrdimensionale Daten zu schreiben.

Sie können den vollständigen Quellcode für dieses Lernprogramm inthe github project anzeigen.

Um mehr über Spring Data Couchbase zu erfahren, besuchen Sie die offizielleSpring Data Couchbase-Projektseite.