AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDBと 引用符の統合

このガイドでは、ウェブフレームワークとしてQuarkusを使用し、MongoDBにアクセスするためにEclipse JNoSQLを使用するJava REST APIを作成する方法を学習できます。が、クラウドネイティブ マイクロサービスとサーバーレス開発向けに設計されたオープンソースのJavaフレームワークです。Eclipse JNOSQL は、 Javaアプリケーションと NoSQL データベースの統合を簡素化するために Java NoSQL および Java Data 仕様を実装します。

このチュートリアルのアプリケーションは、次のレイヤーで構成されています。

  • データベースレイヤー: MongoDB は、データのストレージと検索を提供します。

  • アプリケーションレイヤー: Graphus は、 HTTPリクエスト、ルーティング、依存関係インジェクションを処理します。

  • データ アクセスレイヤー: JNoSQL はMongoDBドキュメントマッピングとリポジトリパターンを提供します。

このチュートリアルでは、 Flexible JNoSQL 拡張機能 を使用してMongoDBにアクセスします。MongoDB は NoSQL データベース用の統合APIを提供し、既知のJavaパターンと注釈を使用してMongoDBを操作できます。その結果、 MongoDBと 引用符 を使用して、最小構成で軽量なアプリケーションを開発できます。

MongoDB をQueryus と統合することで、MongoDB の 柔軟なドキュメントモデルと並行して、Querys の高速スタートアップ時間とリソースの効率的な使用を活用できます。この組み合わせは、タイプの安全性、スケーラビリティ、迅速な開発サイクルを必要とするアプリケーションをサポートします。MongoDBと Clusters を使用して、マイクロサービス、クラウドネイティブ API、高パフォーマンスと低リソース消費を必要とするシステムなどの本番環境のアプリケーションを作成できます。

このチュートリアルでは、 MongoDBと 引用符 を使用するREST APIをビルドする方法について説明します。アプリケーションはサンプルレストラン データにアクセスし、データをクエリし、 RESTflu エンドポイントから結果を返します。チュートリアルには、 MongoDB AtlasでホストされているMongoDBクラスターに接続するための手順も含まれています。

Tip

Quarkusを使用せずにJavaドライバーを使用してMongoDBに接続する場合は、Javaドライバーを使い始めるチュートリアルを参照してください。

このセクションの手順に従って、プロジェクトの依存関係のインストール、Atlas クラスターの作成、およびアプリケーション構造の設定を行います。

1

クイック スタートアプリケーションを作成するには、開発環境に次のソフトウェアをインストールします。

前提条件
ノート

JDK バージョン 21 以降をインストールします。

バージョン 3.8.1 以降を使用します。

このコマンドラインインターフェイスを使用すると、ターミナルから Quarkus プロジェクトを作成および管理できます。
重要: このチュートリアルではバージョン 3.30.6 を使用しています。それ以降のバージョンではエラーが発生する可能性があります。お使いのオペレーティング システムに応じて、インストール手順を実行し、特定のバージョンをインストールします。

コードエディター

お好みのコード エディターを使用してください。

ターミナルアプリとシェル

MacOS ユーザーの場合は、 ターミナル または 類似アプリを使用します。Windowsユーザーの場合は、 PowerShell または コマンドプロンプトを使用します。

2

MongoDB Atlas は、 MongoDB配置をホストするフルマネージドクラウドデータベースサービスです。MongoDBの配置がない場合は、MongoDBを使い始める チュートリアルを完了することで、 MongoDBクラスターを無料で作成できます。MongoDBを使い始める チュートリアルでは、このチュートリアルで使用される sample_restaurantsデータベースなど、サンプルデータセット をクラスターにロードする方法も説明します。

MongoDBクラスターに接続するには、接続文字列を使用する必要があります。接続文字列を取得する方法については、 MongoDBを使い始めるチュートリアルの「 接続文字列列の追加 」セクションを参照してください。

重要

接続stringを安全な場所に保存します。

3

ターミナルから次のコマンドを実行して、 MongoDB用の Quarkus JNoSQL 拡張機能と REST エンドポイントとなる接続されたデバイス用のJSON直列化を構成する quarkus-quickstart という名前の新しい Quarkusプロジェクトを作成します。

quarkus create app quarkus-quickstart --extensions=jnosql-mongodb,resteasy-jackson

次に、次のコマンドを実行中してプロジェクトディレクトリに移動します。

cd quarkus-quickstart
4

src/main/resources/application.propertiesファイルに移動し、次の構成プロパティを追加します。

jnosql.document.database=sample_restaurants
quarkus.mongodb.connection-string=<connection string>

このコードは、 MongoDBクラスター内の sample_restaurantsデータベースへの接続を構成します。<connection string> プレースホルダーを、前の手順で保存した接続文字列に置き換えます。

5

引用符プロジェクトテンプレートには、このチュートリアルで削除できるいくつかのサンプルファイルが含まれています。これらの不要なファイルを削除するには、オペレーティング システムに対応するタブを選択し、quarkus-quickstartディレクトリから次のコマンドを実行します。

rm src/main/java/org/acme/Car.java
rm src/main/java/org/acme/Garage.java
rm src/test/java/org/acme/GarageTest.java
rm src/main/java/org/acme/GreetingResource.java
rm src/test/java/org/acme/GreetingResourceIT.java
rm src/test/java/org/acme/GreetingResourceTest.java
del src/main/java/org/acme/Car.java
del src/main/java/org/acme/Garage.java
del src/test/java/org/acme/GarageTest.java
del src/main/java/org/acme/GreetingResource.java
del src/test/java/org/acme/GreetingResourceIT.java
del src/test/java/org/acme/GreetingResourceTest.java

プロジェクト構造と依存関係を設定したら、このセクションの手順に従って、データモデル、リポジトリクラス、 REST エンドポイントとなる接続されたデバイスを作成します。

1

src/main/java/org/acmeディレクトリに Restaurant.java という名前のファイルを作成し、次のコードを貼り付けます。

quarkus-quickstart/src/main/java/org/acme/Restaurant.java
package org.acme;
import jakarta.nosql.Column;
import jakarta.nosql.Entity;
import jakarta.nosql.Id;
/**
* Represents a restaurant entity from the sample_restaurants database .
* This class is used as an entity in the MongoDB database.
*/
@Entity("restaurants")
public class Restaurant {
@Id
private String id;
@Column
private String name;
@Column
private String borough;
@Column
private String cuisine;
// Default constructor required by JNoSQL
public Restaurant() {}
// Constructor
public Restaurant(String id, String name, String borough,String cuisine) {
this.id = id;
this.name = name;
this.borough = borough;
this.cuisine = cuisine;
}
// Getters and setters
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getBorough() { return borough; }
public void setBorough(String borough) { this.borough = borough; }
public String getCuisine() { return cuisine; }
public void setCuisine(String cuisine) { this.cuisine = cuisine; }
}

このファイルは、sample_restaurants.restaurantsコレクション内のドキュメントにマップする Restaurant エンティティクラスを定義します。@Entity 注釈はこのクラスをJNoSQL エンティティとしてマークし、フィールド注釈はJavaプロパティをドキュメントフィールドにマッピングします。

2

src/main/java/org/acmeディレクトリに RestaurantRepository.java という名前のファイルを作成し、次のコードを貼り付けます。

quarkus-quickstart/src/main/java/org/acme/RestaurantRepository.java
package org.acme;
import jakarta.data.repository.Repository;
import org.eclipse.jnosql.mapping.NoSQLRepository;
import java.util.List;
/**
* Interface for managing restaurant data.
*
* It uses the Jakarta Data Specification capabilities.
*
*/
@Repository
public interface RestaurantRepository extends NoSQLRepository<Restaurant, String> {
List<Restaurant> findByBorough(String borough);
List<Restaurant> findByCuisine(String cuisine);
}

このリポジトリクラスは、 MongoDB内のレストラン データにアクセスするためのメソッドを提供します。カスタム findByBorough() および findByCuisine() クエリ メソッドを定義します。また、RestaurantRepositoryインスタンスを使用して組み込みの作成、読み取り、更新、削除するメソッドにアクセスすることもできます。

3

src/main/java/org/acmeディレクトリに、RestaurantResource.java という名前のファイルを作成し、次のコードを貼り付けます。

quarkus-quickstart/src/main/java/org/acme/RestaurantResource.java
package org.acme;
import jakarta.inject.Inject;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.List;
/**
* REST API controller for restaurant operations.
* Provides endpoints for retrieving restaurant data from MongoDB.
*/
@Path("/restaurants")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class RestaurantResource {
@Inject
RestaurantRepository restaurantRepository;
/**
* Retrieves all restaurants from the database.
*
* @return List of all restaurants
*/
@GET
public Response getAllRestaurants() {
try {
List<Restaurant> restaurants = restaurantRepository.findAll().toList();
System.out.println("Found " + restaurants.size() + " restaurants");
return Response.ok(restaurants).build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Error retrieving restaurants: " + e.getMessage())
.build();
}
}
/**
* Retrieves filtered restaurants in Queens that contain "Moon" in the name.
*
* @return List of filtered restaurants
*/
@GET
@Path("/browse")
public Response getFilteredRestaurants() {
try {
// Temporarily use findAll() to test basic connectivity
List<Restaurant> allRestaurants = restaurantRepository.findAll().toList();
System.out.println("Total restaurants found: " + allRestaurants.size());
// Filter for Queens restaurants that also have "Moon" in the name
List<Restaurant> queensRestaurants = allRestaurants.stream()
.filter(restaurant -> "Queens".equals(restaurant.getBorough()) &&
restaurant.getName() != null &&
restaurant.getName().toLowerCase().contains("moon"))
.toList();
System.out.println("Queens restaurants found: " + queensRestaurants.size());
return Response.ok(queensRestaurants).build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Error retrieving filtered restaurants: " + e.getMessage())
.build();
}
}
/**
* Retrieves restaurants by cuisine type.
*
* @param cuisine The cuisine type to filter for
* @return List of restaurants that have the specified cuisine
*/
@GET
@Path("/cuisine/{cuisine}")
public Response getRestaurantsByCuisine(@PathParam("cuisine") String cuisine) {
try {
List<Restaurant> restaurants = restaurantRepository.findByCuisine(cuisine);
return Response.ok(restaurants).build();
} catch (Exception e) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity("Error retrieving restaurants by cuisine: " + e.getMessage())
.build();
}
}
}

この RESTリソースクラスは、次のHTTPエンドポイントを定義します。

  • GET /restaurants/: restaurantsコレクションからすべてのドキュメントを取得します

  • GET /restaurants/browse: 名前に "Moon" を含むクイーンズのレストランを表すドキュメントを検索し、大文字と小文字を区別しないクエリを実行します

  • GET /restaurants/cuisine/{cuisine}: 指定された cuisine 値を提供するレストランを表すドキュメントを取得します

4

src/test/java/org/acmeディレクトリに、RestaurantRepositoryTest.java という名前のファイルを作成し、次のコードを貼り付けます。

quarkus-quickstart/src/test/java/org/acme/RestaurantRepositoryTest.java
package org.acme;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
/**
* RestaurantRepositoryTest is a test class for testing the RestaurantRepository operations.
*
* It uses the Quarkus Test framework to test the restaurant data access.
*/
@QuarkusTest
public class RestaurantRepositoryTest {
@Inject
RestaurantRepository restaurantRepository;
@Test
@DisplayName("Should retrieve restaurants from the database")
public void testRetrieveRestaurants() {
// Test repository injection and MongoDB connection
assertThat(restaurantRepository).isNotNull();
}
@Test
@DisplayName("Should find restaurants by borough")
public void testFindRestaurantsByBorough() {
// Test that the method exists and returns data
List<Restaurant> restaurants = restaurantRepository.findByBorough("Queens");
assertThat(restaurants).isNotNull();
}
}

このファイルは、統合テストに Quorum のテストフレームワークを使用します。このコードでは、 MongoDB接続をテストするための次のメソッドを定義しています。

  • testRetrieveRestaurants(): RestaurantRepositoryクラスがMongoDB にアクセスしていることを確認します

  • testFindRestaurantsByBorough(): findByBorough() メソッドがMongoDBデータを検索することを確認します

最後に、このセクションの手順に従ってREST API を実行し、curl コマンドを使用してエンドポイントとなる接続されたデバイスをテストします。

1

まず、プロジェクトディレクトリから次のコマンドを実行してテスト スイートを実行します。

./mvnw test

このコマンドは RestaurantRepositoryTestクラスを実行し、アプリケーションがMongoDBデータにアクセスできることを確認します。成功した場合、コマンド出力には次の情報が含まれます。

[INFO] Results:
[INFO]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: ... s
[INFO] Finished at: ...
[INFO] ------------------------------------------------------------------------
2

プロジェクトディレクトリから、次のコマンドを実行してアプリケーションをコンパイルし、開発モードで起動します。

./mvnw quarkus:dev
3

REST エンドポイントとなる接続されたデバイスをテストするには、別のターミナルウィンドウで次の curl コマンドを実行します。各エンドポイントは、 sample_restaurants.restaurantsコレクションからのレストラン情報を含むJSONデータを返します。成功した場合、コマンドはサンプル出力のようなデータを返します。

  1. すべてのレストランを検索します。

    curl http://localhost:8080/restaurants/
    [{"id":"...","name":"Morris Park Bake Shop","borough":"Bronx","cuisine":"Bakery"},
    {"id":"...","name":"Wilken'S Fine Food","borough":"Brooklyn","cuisine":"Delicatessen"},
    {"id":"...","name":"Taste The Tropics Ice Cream","borough":"Brooklyn","cuisine":"Ice Cream,
    Gelato, Yogurt, Ices"},
    {"id":"...","name":"Carvel Ice Cream","borough":"Queens","cuisine":"Ice Cream, Gelato, Yogurt,
    Ices"},
    ...]
  2. 名前に "Moon" が含まれるクイーンズのレストランを検索する。

    curl http://localhost:8080/restaurants/browse
    [{"id":"...","name":"Somoon","borough":"Queens","cuisine":"Asian"},
    {"id":"...","name":"New Moon Star Restaurant","borough":"Queens","cuisine":"Chinese"},
    {"id":"...","name":"Moon Tikka Grill","borough":"Queens","cuisine":"Indian"},
    {"id":"...","name":"Silver Moon Diner","borough":"Queens","cuisine":"American"},
    {"id":"...","name":"Mooney'S Public House","borough":"Queens","cuisine":"Irish"},
    {"id":"...","name":"Moon Light Crill Rest.","borough":"Queens","cuisine":"Indian"},
    {"id":"...","name":"Full Moon Cafe","borough":"Queens","cuisine":"Café/Coffee/Tea"},
    {"id":"...","name":"Pacific Moon","borough":"Queens","cuisine":"Chinese"},
    {"id":"...","name":"Moon Palace Kitchen","borough":"Queens","cuisine":"Chinese"},
    {"id":"...","name":"Honey Moon Coffee Shop 1766096115682","borough":"Queens","cuisine":"Café/Coffee/Tea"},
    {"id":"...","name":"Honey Moon Coffee Shop","borough":"Queens","cuisine":"Café/Coffee/Tea"}]
  3. 料理の種類でレストランを検索します。

    次のコマンドは、cuisine 値が "Czech" であるレストランをクエリしますが、このパラメータは任意の料理に置き換えることができます。

    curl http://localhost:8080/restaurants/cuisine/Czech
    [{"id":"...","name":"Koliba Restaurant","borough":"Queens","cuisine":"Czech"},
    {"id":"...","name":"Milan'S Restaurant","borough":"Brooklyn","cuisine":"Czech"},
    {"id":"...","name":"Bohemian Beer Garden","borough":"Queens","cuisine":"Czech"},
    {"id":"...","name":"Hospoda","borough":"Manhattan","cuisine":"Czech"},
    {"id":"...","name":"Olde Prague Tavern","borough":"Queens","cuisine":"Czech"},
    {"id":"...","name":"Brooklyn Beet Company","borough":"Brooklyn","cuisine":"Czech"}]

Quorum クイック スタート チュートリアルが完了しました。これらの手順を完了すると、MongoDBの配置に接続し、サンプルレストラン データに対してクエリを実行し、curl コマンドを使用してテストできるHTTPエンドポイントを介して結果を公開するJava Quarkus REST APIが備えられます。

引用符、JNoSQL、 MongoDBの詳細については、次のリソースを参照してください。