MongoDB でデータアクセス

このガイドでは、Spring Data MongoDB を使用して、ドキュメントベースのデータベースである MongoDB (英語) にデータを保存および取得するアプリケーションを構築するプロセスを順を追って説明します。

構築するもの

Spring Data MongoDB を使用して、Customer POJO(プレーンオールド Java オブジェクト)を MongoDB データベースに保存します。

必要なもの

本ガイドの完成までの流れ

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Spring Initializr から開始に進みます。

基本をスキップするには、次の手順を実行します。

完了したときは、gs-accessing-data-mongodb/complete のコードに対して結果を確認できます。

Spring Initializr から開始

IDE を使用する場合はプロジェクト作成ウィザードを使用します。IDE を使用せずにコマンドラインなどで開発する場合は、この事前に初期化されたプロジェクトからプロジェクトを ZIP ファイルとしてダウンロードできます。このプロジェクトは、このチュートリアルの例に合うように構成されています。

プロジェクトを手動で初期化するには:

  1. IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。

  2. Gradle または Maven のいずれかと、使用する言語を選択します。このガイドは、Java を選択したことを前提としています。

  3. 依存関係をクリックし、Spring Data MongoDB と Testcontainers を選択します。

  4. 生成をクリックします。

  5. 結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。

Eclipse や IntelliJ のような IDE は新規プロジェクト作成ウィザードから Spring Initializr の機能が使用できるため、手動での ZIP ファイルのダウンロードやインポートは不要です。
プロジェクトを Github からフォークして、IDE または他のエディターで開くこともできます。

MongoDB のインストールと起動

このガイドを機能させるには、ローカル MongoDB サーバーを立ち上げる必要があります。

Homebrew がインストールされている Mac OS X マシンで、次のコマンドを実行します。

brew tap mongodb/brew
brew install mongodb-community

https://docs.mongodb.org/manual/installation/ (英語) にインストールオプションがあります。

MongoDB をインストールしたら、サービスを起動する必要があります。Mac では、次のコマンドを使用できます。

$ brew services start mongodb-community

mongosh コマンドを実行して、別のターミナルウィンドウから MongoDB クライアントを起動できます。

単純なエンティティを定義する

MongoDB は NoSQL ドキュメントストアです。この例では、Customer オブジェクトを保存します。次のリストは、Customer クラス(src/main/java/com/example/accessingdatamongodb/Customer.java 内)を示しています。

package com.example.accessingdatamongodb;

import org.jspecify.annotations.Nullable;
import org.springframework.data.annotation.Id;

public class Customer {

  @Id
  public @Nullable String id;

  public String firstName;
  public String lastName;

  public Customer() {}

  public Customer(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @Override
  public String toString() {
    return String.format(
        "Customer[id=%s, firstName='%s', lastName='%s']",
        id, firstName, lastName);
  }

}

ここでは、3 つの属性 id、firstName、lastName を持つ Customer クラスがあります。id は主に MongoDB の内部使用を目的としています。また、2 つのコンストラクターがあります。デフォルトコンストラクターは Spring Data MongoDB 専用であり、もう 1 つのコンストラクターはデータベースに保存する Customer のインスタンスを作成するために使用します。

このガイドでは、一般的な getter と setter は簡潔にするために省略されています。

id には @Id がアノテーション付けされているため、Spring Data MongoDB はそれをドキュメントの ID フィールドとして識別できます。

他の 2 つのプロパティ firstName と lastName にはアノテーションが付けられていません。これらは、プロパティ自体と同じ名前を共有するフィールドにマップされると想定されています。

便利な toString() メソッドは、顧客に関する詳細を出力します。

MongoDB はデータをコレクションに保存します。Spring Data MongoDB は、Customer クラスを customer と呼ばれるコレクションにマップします。コレクションの名前を変更する場合は、クラスで Spring Data MongoDB の @Document (Javadoc) アノテーションを使用できます。

単純なクエリを作成する

Spring Data MongoDB は、MongoDB へのデータの保存に重点を置いています。また、クエリを派生させる機能など、Spring Data Commons プロジェクトから機能を継承します。基本的に、MongoDB のクエリ言語を学ぶ必要はありません。いくつかのメソッドを書くことができ、クエリはあなたのために書かれます。

これがどのように機能するかを確認するには、次のリスト(src/main/java/com/example/accessingdatamongodb/CustomerRepository.java 内)が示すように、Customer ドキュメントを照会するリポジトリインターフェースを作成します。

package com.example.accessingdatamongodb;

import java.util.List;

import org.jspecify.annotations.Nullable;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface CustomerRepository extends MongoRepository<Customer, String> {

  @Nullable
  Customer findByFirstName(String firstName);

  List<Customer> findByLastName(String lastName);

}

CustomerRepository は MongoRepository インターフェースを継承し、動作する値の型と ID をそれぞれ Customer と String に差し込みます。このインターフェースには、標準の CRUD 操作(作成、読み取り、更新、削除)を含む多くの操作が付属しています。

他のクエリを定義するには、メソッドシグネチャーを宣言します。この場合、findByFirstName を追加します。これは、本質的に型 Customer のドキュメントを検索し、firstName で一致するドキュメントを検索します。

findByLastName もあります。これは、姓で人のリストを検索します。

典型的な Java アプリケーションでは、CustomerRepository を実装するクラスを作成し、自分でクエリを作成します。Spring Data MongoDB を非常に便利にしているのは、この実装を作成する必要がないという事実です。Spring Data MongoDB は、アプリケーションを実行すると、その場で作成します。

これで、このアプリケーションを接続して、その外観を確認できます!

アプリケーションクラスを作成する

Spring Initializr は、アプリケーションの単純なクラスを作成します。次のリストは、Initializr がこの例(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java 内)で作成したクラスを示しています。

package com.example.accessingdatamongodb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AccessingDataMongodbApplication {

  public static void main(String[] args) {
    SpringApplication.run(AccessingDataMongodbApplication.class, args);
  }

}

@SpringBootApplication は、次のすべてを追加する便利なアノテーションです。

  • @Configuration: アプリケーションコンテキストの Bean 定義のソースとしてクラスにタグを付けます。

  • @EnableAutoConfiguration: クラスパス設定、他の Bean、さまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例: spring-webmvc がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet のセットアップなどの主要な動作をアクティブにします。

  • @ComponentScan: Spring に、com/example パッケージ内の他のコンポーネント、構成、サービスを探して、コントローラーを検出させるように指示します。

main() メソッドは、Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。

Spring Boot は、@SpringBootApplication クラスの同じパッケージ(またはサブパッケージ)に含まれている限り、これらのリポジトリを自動的に処理します。登録プロセスをさらに制御するには、@EnableMongoRepositories アノテーションを使用できます。

デフォルトでは、@EnableMongoRepositories は現在のパッケージをスキャンして、Spring Data のリポジトリインターフェースの 1 つを継承するインターフェースを探します。プロジェクトレイアウトに複数のプロジェクトがあり、リポジトリが見つからない場合は、basePackageClasses=MyRepository.class を使用して、型ごとに異なるルートパッケージをスキャンするように Spring Data MongoDB に安全に指示できます。

Spring Data MongoDB は、MongoTemplate を使用して、find* メソッドの背後にあるクエリを実行します。テンプレートを自分で使用してより複雑なクエリを実行することもできますが、このガイドではそれについては説明していません。(Spring Data MongoDB リファレンスガイドを参照)

ここで、Initializr が作成した単純なクラスを変更する必要があります。データを設定し、それを使用して出力を生成する必要があります。次のリストは、完成した AccessingDataMongodbApplication クラス(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java 内)を示しています。

package com.example.accessingdatamongodb;

import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AccessingDataMongodbApplication {

  public static void main(String[] args) {
    SpringApplication.run(AccessingDataMongodbApplication.class, args);
  }

  @Bean
  ApplicationRunner runner(CustomerRepository repository) {
    return args -> {

      repository.deleteAll();

      // save a couple of customers
      repository.save(new Customer("Alice", "Smith"));
      repository.save(new Customer("Bob", "Smith"));

      // fetch all customers
      System.out.println("Customers found with findAll():");
      System.out.println("-------------------------------");
      for (Customer customer : repository.findAll()) {
        System.out.println(customer);
      }
      System.out.println();

      // fetch an individual customer
      System.out.println("Customer found with findByFirstName('Alice'):");
      System.out.println("--------------------------------");
      System.out.println(repository.findByFirstName("Alice"));

      System.out.println("Customers found with findByLastName('Smith'):");
      System.out.println("--------------------------------");
      for (Customer customer : repository.findByLastName("Smith")) {
        System.out.println(customer);
      }
    };
  }

}

AccessingDataMongodbApplication には、CustomerRepository のインスタンスをオートワイヤーする main() メソッドが含まれています。Spring Data MongoDB は動的にプロキシを作成し、そこに挿入します。いくつかのテストを通じて CustomerRepository を使用します。まず、いくつかの Customer オブジェクトを保存し、save() メソッドを示し、使用するデータを設定します。次に、findAll() を呼び出して、データベースからすべての Customer オブジェクトをフェッチします。次に、findByFirstName() を呼び出して、彼女の名で 1 つの Customer をフェッチします。最後に、findByLastName() を呼び出して、姓が Smith であるすべての顧客を検索します。

デフォルトでは、Spring Boot はローカルでホストされている MongoDB のインスタンスへの接続を試みます。他の場所でホストされている MongoDB のインスタンスをアプリケーションにポイントする方法の詳細については、リファレンスドキュメントを参照してください。

実行可能 JAR を構築する

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、リソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、デプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-accessing-data-mongodb-0.0.1-SNAPSHOT.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-accessing-data-mongodb-0.0.1-SNAPSHOT.jar

AccessingDataMongodbApplication は CommandLineRunner を実装するため、Spring Boot の開始時に run メソッドが自動的に呼び出されます。次のようなものが表示されます(クエリなどの他の出力もあります)。

Customers found with findAll():
-------------------------------
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

Customer found with findByFirstName('Alice'):
--------------------------------
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customers found with findByLastName('Smith'):
--------------------------------
Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith']
Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']

要約

おめでとう! MongoDB サーバーをセットアップし、Spring Data MongoDB を使用してオブジェクトをデータベースに保存したり、データベースからフェッチしたりする簡単なアプリケーションを作成しました。すべて、具体的なリポジトリの実装を作成する必要はありません。

少ない労力でハイパーメディアベースの RESTful フロントエンドで MongoDB リポジトリを公開する場合は、Spring Data REST API の自動生成 (MongoDB) を参照してください。

関連事項

次のガイドも役立つかもしれません:

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語) 。

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の帰属表示、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。

コードを入手する