Docs Menu
Docs Home
/ /

MongoDBと 引用符の統合

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

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

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

1

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

前提条件
ノート

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

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

This command-line interface allows you to create and manage Quarkus projects from your terminal.
Important: This tutorial uses version 3.30.6, and later versions might cause errors. Follow the installation instructions corresponding to your operating system to install the specific version.

コードエディター

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

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

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

2

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

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

重要

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

3

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

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>

このコードは、sample_restaurants MongoDBクラスター内の データベースへの接続を構成します。<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 という名前のファイルを作成し、次のコードを貼り付けます。

radian済み.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 という名前のファイルを作成し、次のコードを貼り付けます。

qualkus-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 という名前のファイルを作成し、次のコードを貼り付けます。

qualkus-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 という名前のファイルを作成し、次のコードを貼り付けます。

qualkus-quickstart/src/テスト/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が備えられます 。

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

戻る

Spring Data MongoDB統合

項目一覧