このガイドのコード例は、QuickTour.java から取得されていますドライバーソースコードGithubリポジトリ内のファイル。
注意
Java Reactive Streams ドライバーをインストールする方法について詳しくは、 インストール ガイドを参照してください。
重要
このガイドでは、クイック スタート プライマリで説明されている Subscriber
の実装を使用します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
MongoDB のデフォルトポートで実行されている MongoDB サーバー(
27017
)プロジェクトにインストールされたドライバーの依存関係
次のインポート ステートメントは次のとおりです。
import com.mongodb.bulk.BulkWriteResult; import com.mongodb.client.model.BulkWriteOptions; import com.mongodb.client.model.DeleteOneModel; import com.mongodb.client.model.InsertOneModel; import com.mongodb.client.model.ReplaceOneModel; import com.mongodb.client.model.UpdateOneModel; import com.mongodb.client.model.WriteModel; import com.mongodb.client.result.InsertOneResult; import com.mongodb.client.result.InsertManyResult; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import org.bson.Document; import java.util.ArrayList; import java.util.List; import static com.mongodb.client.model.Accumulators.*; import static com.mongodb.client.model.Aggregates.*; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Projections.*; import static com.mongodb.client.model.Sorts.*; import static com.mongodb.client.model.Updates.*; import static java.util.Arrays.asList; import static java.util.Collections.singletonList;
接続を行う
実行中の MongoDB 配置に接続するには、 MongoClients.create()
メソッドを使用します。
MongoClient
インスタンスは、データベースへの接続のプールを表します。 同時操作スレッドを使用する場合でも、必要なインスタンスはMongoClient
の 1 つだけです。
重要
通常、スタンドアロン配置、レプリカセット、シャーディングされたクラスターなどの特定の MongoDB 配置に対してMongoClient
インスタンスを 1 つだけ作成し、アプリケーション全体でクライアントを使用します。 ただし、 インスタンスを複数作成する場合は、次の点に注意してください。
すべてのリソース使用量の制限(最大接続数など)は各
MongoClient
インスタンスに適用されます。インスタンスを破棄するには、
MongoClient.close()
メソッドを呼び出してリソースをクリーンアップします。
単一の MongoDB 配置への接続
次の例は、MongoDB の単一配置に接続する方法をいくつか示しています。
次の方法で、単一の MongoDB 配置に接続できます。
ポート
27017
の localhost で実行されている MongoDB サーバーに接続するために、 パラメータなしでMongoClient
オブジェクトをインスタンス化します。MongoClient mongoClient = MongoClients.create(); ポート
27017
の指定されたホストで実行されている MongoDB インスタンスに接続するには、hostname
を明示的に指定します。MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("hostOne")))) .build()); hostname
とport
を明示的に指定します。MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList(new ServerAddress("hostOne", 27018)))) .build()); ConnectionString
を指定します。MongoClient mongoClient = MongoClients.create("mongodb://hostOne:27017");
データベースへのアクセス
MongoClient
インスタンスがMongoDB 配置に接続されたら、MongoClient.getDatabase()
メソッドを使用してデータベースにアクセスします。
getDatabase()
メソッドにデータベースの名前を指定します。 データベースが存在しない場合は、そのデータベースのデータを最初に保存するときに MongoDB によってデータベースが作成されます。
次の例では、 mydb
データベースにアクセスします。
MongoDatabase database = mongoClient.getDatabase("mydb");
MongoDatabase
インスタンスは不変です。
コレクションにアクセスする
MongoDatabase
インスタンスが作成されたら、 getCollection()`
メソッドを使用してコレクションにアクセスします。
getCollection()
メソッドにコレクションの名前を指定します。 コレクションが存在しない場合、MongoDB は最初にそのコレクションにデータを保存する際にコレクションを作成します。
たとえば、次のステートメントは、 データベース インスタンスを使用して、 mydb
データベース内のtest
という名前のコレクションにアクセスします。
MongoCollection<Document> collection = database.getCollection("test");
MongoCollection
インスタンスは不変です。
ドキュメントの作成
ドライバーを使用してドキュメントを作成するには、 Document
クラスを使用します。
たとえば、次の JSON ドキュメントについて考えてみます。
{ "name" : "MongoDB", "type" : "database", "count" : 1, "versions": [ "v3.2", "v3.0", "v2.6" ], "info" : { x : 203, y : 102 } }
ドライバーを使用してドキュメントを作成するには、 フィールドと値を持つDocument
オブジェクトをインスタンス化し、そのappend()
メソッドを使用して、ドキュメント オブジェクトに追加のフィールドと値を含めます。 埋め込みドキュメントを指定するには、値を別のDocument
オブジェクトにすることができます。
Document doc = new Document("name", "MongoDB") .append("type", "database") .append("count", 1) .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6")) .append("info", new Document("x", 203).append("y", 102));
注意
配列の BSON 型は Java 型java.util.List
に対応します。 BSON types と Java の対応するタイプのリストについては、 Document
マッピングを参照してください。
ドキュメントの挿入
MongoCollection
オブジェクトを取得したら、コレクションにドキュメントを挿入できます。
1つのドキュメントの挿入
コレクションに単一のドキュメントを挿入するには、 insertOne()
メソッドを使用できます。
var subscriber = new OperationSubscriber<InsertOneResult>(); collection.insertOne(doc).subscribe(subscriber); // Wait for the insertOne operation to complete subscriber.await();
注意
ドキュメントに最上位の_id
フィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加します。
重要
API では、 Publisher
インスタンスを返すすべてのメソッドはコールド ストリームです。つまり、サブスクライブされるまで何も発生しません。
たとえば、以下の例では何も行われません。
Publisher<InsertOneResult> publisher = collection.insertOne(doc);
この操作は、 Publisher
がサブスクライブし、データがリクエストされた場合にのみ発生します。
publisher.subscribe(new Subscriber<InsertOneResult>() { public void onSubscribe(final Subscription s) { s.request(1); // <--- Data requested and the insertion will now occur } public void onNext(final InsertOneResult result) { System.out.println("Inserted: " + result); } public void onError(final Throwable t) { System.out.println("Failed"); } public void onComplete() { System.out.println("Completed"); } });
ドキュメントが挿入されると、 onNext()
メソッドが呼び出され、 Inserted:
とそれに続く結果が出力されます。 最後に、 onComplete()
メソッドはCompleted
を出力します。 何らかの理由でエラーが発生した場合、 onError()
メソッドはFailed
を出力します。
複数のドキュメントの挿入
複数のドキュメントを挿入するには、挿入するドキュメントのリストを受け取るコレクションのinsertMany()
メソッドを使用できます。
次の例では、次の形式で複数のドキュメントを追加しています。
{ "i" : value }
ループ内でドキュメントを作成し、 documents
リストに追加します。
List<Document> documents = new ArrayList<Document>(); for (int i = 0; i < 100; i++) { documents.add(new Document("i", i)); }
これらのドキュメントをコレクションに挿入するには、ドキュメントのリストをinsertMany()
メソッドに渡します。
var subscriber = new OperationSubscriber<InsertManyResult>(); collection.insertMany(documents).subscribe(subscriber); // Wait for the insertMany operation to complete subscriber.await();
前の例では、 Publisher
で をブロックして終了します。 これにより、次の操作が実行される前にデータがデータベースに存在するようになります。
コレクション内のドキュメントをカウント
コレクション内のドキュメント数をカウントするには、コレクションのcountDocuments()
メソッドを使用できます。 次のコードでは101
が出力され、 insertMany()
を使用して挿入された100とinsertOne()
を使用して挿入された1が記述されます。
collection.count() .subscribe(new PrintSubscriber<Long>("total # of documents: %s"));
コレクションをクエリする
コレクションをクエリするには、コレクションのfind()
メソッドを使用できます。 引数なしで メソッドを呼び出して、コレクション内のすべてのドキュメントをクエリしたり、フィルターを渡してフィルター条件に一致するドキュメントをクエリしたりできます。
コレクション内の最初のドキュメントの検索
コレクションの最初のドキュメントを返すには、パラメータなしでfind()
メソッドを使用し、 first()
メソッドをチェーンします。
Tip
find().first()
構造は、1 つのドキュメントのみに一致する必要があるクエリや、最初に一致するドキュメントのみを検討する場合に便利です。
次の例では、 コレクションで最初に見つかったドキュメントを出力します。
collection.find().first().subscribe(new PrintDocumentSubscriber());
この例では、次のドキュメントが出力されます。
{ "_id" : { "$oid" : "551582c558c7b4fbacf16735" }, "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { "x" : 203, "y" : 102 } }
注意
_id
要素は MongoDB によってドキュメントに自動的に追加され、値は表示されている値とは異なります。 MongoDB は、内部使用のために_
と$
で始まるフィールド名を予約します。
コレクション内の全ドキュメントの検索
コレクション内のすべてのドキュメントを取得するには、 find()
メソッドを使用します。 find()
メソッドは、検索操作を連鎖または制御するためのスムーズなインターフェースを提供するFindPublisher
インスタンスを返します。 次のコードは、 コレクション内のすべてのドキュメントを検索して出力します。
collection.find().subscribe(new PrintDocumentSubscriber());
クエリフィルターの指定
特定の条件に一致するドキュメントをクエリするには、フィルター オブジェクトをfind()
メソッドに渡します。 フィルター オブジェクトの作成を容易にするために、ドライバーはFilters
ヘルパー メソッドを提供します。
フィルターに一致する単一ドキュメントを取得する
フィールドi
の値が71
である最初のドキュメントを検索するには、 eq()
フィルター定義を渡して等価条件を指定します。
collection.find(eq("i", 71)).first().subscribe(new PrintDocumentSubscriber());
この例では 1 つのドキュメントが出力されます。
{ "_id" : { "$oid" : "5515836e58c7b4fbc756320b" }, "i" : 71 }
フィルターに一致するすべてのドキュメントを取得する
次の例では、 i
の値が50
より大きいすべてのドキュメントを返して出力します。
collection.find(gt("i", 50)).subscribe(new PrintDocumentSubscriber());
50 < i <= 100
などの範囲のフィルターを指定するには、 and()
ヘルパーを使用できます。
collection.find(and(gt("i", 50), lte("i", 100))) .subscribe(new PrintDocumentSubscriber());
Update Documents
コレクション内のドキュメントを更新するには、コレクションのupdateOne()
メソッドとupdateMany()
メソッドを使用できます。
次のパラメーターをメソッドに渡します。
更新するドキュメントを決定するためのフィルター オブジェクト。 フィルター オブジェクトの作成を容易にするために、ドライバーは
Filters
ヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocument
オブジェクトを使用します。変更を指定するドキュメントを更新します。 使用可能な演算子のリストを表示するには、サーバー マニュアルの「更新演算子 」を参照してください。
更新メソッドは、更新によって変更されたドキュメントの数など、操作に関する情報を提供するUpdateResult
タイプを返します。
単一ドキュメントの更新
単一のドキュメントを更新するには、 updateOne()
メソッドを使用します。
次の例では、 i
が10
である最初のドキュメントを更新し、 i
の値を110
に設定します。
collection.updateOne(eq("i", 10), set("i", 110)) .subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s"));
複数のドキュメントの更新
クエリフィルターに一致するすべてのドキュメントを更新するには、 updateMany()
メソッドを使用します。
次の例では、i
100
の値がi
より小さいすべてのドキュメントで、 の値を100
ずつ増加させます。
UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100)) .subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s"));
Delete Documents
コレクションからドキュメントを削除するには、コレクションのdeleteOne()
メソッドとdeleteMany()
メソッドを使用できます。
フィルター オブジェクトを渡して、削除するドキュメントを決定します。 フィルター オブジェクトの作成を容易にするために、ドライバーはFilters
ヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocument
オブジェクトを使用します。
削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供するDeleteResult
が返されます。
フィルターに一致する単一ドキュメントの削除
フィルターに一致するドキュメントを 1 つ削除するには、 deleteOne()
メソッドを使用します。
次の例では、 の値がi
と等しい 最初の110
ドキュメントを削除しています。
collection.deleteOne(eq("i", 110)) .subscribe(new PrintSubscriber<DeleteResult>("Delete Result: %s"));
フィルターに一致するすべてのドキュメントの削除
フィルターに一致するすべてのドキュメントを削除するには、 deleteMany()
メソッドを使用します。
次の例では、 の値がi
100
以上であるすべてのドキュメントを削除しています。
DeleteResult deleteResult = collection.deleteMany(gte("i", 100)) .subscribe(new PrintSubscriber<DeleteResult>("Delete Result: %s"));
インデックスの作成
1 つまたは複数のフィールドにインデックスを作成するには、インデックス仕様ドキュメントをcreateIndex()
メソッドに渡します。 インデックスキー仕様ドキュメントには、次のドキュメントをモデル化した各フィールドのインデックスとインデックスのタイプが含まれています。
new Document(<field1>, <type1>).append(<field2>, <type2>) ...
昇順のインデックス タイプを作成するには、 <type>
の1
を指定します。 降順のインデックス タイプを作成するには、 <type>
の-1
を指定します。
次の例では、 i
フィールドに昇順のインデックスを作成しています。
collection.createIndex(new Document("i", 1)) .subscribe(new PrintSubscriber<String>("Create Index Result: %s"));
他のインデックス タイプのリストを表示するには、「インデックスの作成」ガイドを参照してください。
詳細情報
POJO で MongoDB を使用する方法を示すその他のチュートリアルについては、「クイック スタート(POJO の例) 」ガイドを参照してください。
その他のチュートリアルについては、「チュートリアル」セクションを参照してください。