Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/

クイック スタート

項目一覧

  • 前提条件
  • 接続を行う
  • 単一の MongoDB 配置への接続
  • データベースへのアクセス
  • コレクションにアクセスする
  • ドキュメントの作成
  • ドキュメントの挿入
  • 1つのドキュメントの挿入
  • 複数のドキュメントの挿入
  • コレクション内のドキュメントをカウント
  • コレクションをクエリする
  • コレクション内の最初のドキュメントの検索
  • コレクション内の全ドキュメントの検索
  • クエリフィルターの指定
  • フィルターに一致する単一ドキュメントを取得する
  • フィルターに一致するすべてのドキュメントを取得する
  • Update Documents
  • 単一ドキュメントの更新
  • 複数のドキュメントの更新
  • Delete Documents
  • フィルターに一致する単一ドキュメントの削除
  • フィルターに一致するすべてのドキュメントの削除
  • インデックスの作成
  • 詳細情報

このガイドのコード例は、 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 配置に接続できます。

  • ポート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());
  • hostnameportを明示的に指定します。

    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オブジェクトを取得したら、コレクションにドキュメントを挿入できます。

コレクションに単一のドキュメントを挿入するには、 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>() {
@Override
public void onSubscribe(final Subscription s) {
s.request(1); // <--- Data requested and the insertion will now occur
}
@Override
public void onNext(final InsertOneResult result) {
System.out.println("Inserted: " + result);
}
@Override
public void onError(final Throwable t) {
System.out.println("Failed");
}
@Override
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());

コレクション内のドキュメントを更新するには、コレクションのupdateOne() メソッドとupdateMany() メソッドを使用できます。

次のパラメーターをメソッドに渡します。

  • 更新するドキュメントを決定するためのフィルター オブジェクト。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocumentオブジェクトを使用します。

  • 変更を指定するドキュメントを更新します。 使用可能な演算子のリストを表示するには、サーバー マニュアルの「更新演算子 」を参照してください。

更新メソッドは、更新によって変更されたドキュメントの数など、操作に関する情報を提供するUpdateResultタイプを返します。

単一のドキュメントを更新するには、 updateOne()メソッドを使用します。

次の例では、 i10である最初のドキュメントを更新し、 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"));

コレクションからドキュメントを削除するには、コレクションの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 の例) 」ガイドを参照してください。

その他のチュートリアルについては、「チュートリアル」セクションを参照してください。

戻る

Primer