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

POJO CRUD 操作例

項目一覧

  • 前提条件
  • カスタム CodecRegistry の作成
  • CodecRegistry の使用
  • MongoDB への POJO の挿入
  • 人物インスタンスの挿入
  • 複数のユーザー インスタンスの挿入
  • コレクションをクエリする
  • クエリフィルターの指定
  • フィルターに一致する単一の人物を取得する
  • フィルターに一致するすべての人のインスタンスを取得する
  • Update Documents
  • 単一のユーザーの更新
  • 複数のユーザー インスタンスを更新
  • 単一のユーザーの置換
  • Delete Documents
  • フィルターに一致する 1 人のユーザーを削除
  • フィルターに一致するすべてのユーザー インスタンスの削除

このガイドでは、汎用の Documentクラスではなく、Plain Old Java Objects(POJO)を使用してドキュメントをモデル化します。

このガイドのコード例は、 PojoQuickTour.java から取得されています ドライバー ソース コードGithub リポジトリ内のファイル。

重要

このガイドでは、カスタムSubscriber実装を使用します。これについては、 カスタム サブスクリプション実装ガイドで説明されています。

このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。

  • MongoDB のデフォルトポートで実行されている MongoDB サーバー( 27017

  • プロジェクトにインストールされたドライバーの依存関係

  • 次のインポート ステートメントは次のとおりです。

    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.codecs.configuration.CodecRegistry;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import java.util.List;
    import static com.mongodb.client.model.Filters.*;
    import static com.mongodb.client.model.Updates.*;
    import static java.util.Arrays.asList;
    import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
    import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
  • POJO クラスの定義。 Githubのドライバーソースリポジトリから Person POJO と Address POJO の完全なコードをコピーします。

ドライバーで POJO を使用する前に、POJO の BSON との間の変換を処理するコーデックを含むようにCodecRegistryを構成する必要があります。 その最も簡単な方法は、 PojoCodecProvider.builder()メソッドを使用してCodecProviderを作成および構成することです。

次の例では、デフォルトのコーデック レジストリと POJO Codecインスタンスを自動的に作成するように構成されたPojoCodecProviderを組み合わせています。

CodecRegistry pojoCodecRegistry = fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build())
);

注意

リクエストされたクラスのコーデックが返されるまで、レジストリは順番にチェックされます。 DefaultCodecRegistryはリストの最初である必要があり、 PojoCodecProviderは常に最後のCodecProviderである必要があります。これは、ほとんどすべてのクラスでコーデックを提供できるためです。

次のリストでは、使用するようにpojoCodecRegistryを設定する方法を説明します。

  • MongoClientオブジェクトをインスタンス化するときに設定します。

    MongoClientSettings settings = MongoClientSettings.builder()
    .codecRegistry(pojoCodecRegistry)
    .build();
    MongoClient mongoClient = MongoClients.create(settings);
  • 代替のCodecRegistryMongoDatabaseを使用する。

    database = database.withCodecRegistry(pojoCodecRegistry);
  • 代替のCodecRegistryMongoCollectionを使用する。

    collection = collection.withCodecRegistry(pojoCodecRegistry);

コーデック レジストリは自動的に不明なクラス用の POJO Codecを作成しようとします。 そのため、追加構成なしで POJO をそのまま使用できるようになります。

MongoDB に POJO を挿入する前に、POJO クラスで構成されたMongoCollectionインスタンスを作成します。

MongoCollection<Person> collection = database.getCollection("people", Person.class);

コレクションにPersonを挿入するには、コレクションのinsertOne()メソッドを使用します。

Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1"));
collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());

複数のPersonインスタンスを挿入するには、コレクションのinsertMany()メソッドを使用できます。このメソッドは、 Personインスタンスのリストをパラメータとして受け取ります。

次の例では、複数のPersonインスタンスを コレクションに追加します。

List<Person> people = asList(
new Person("Charles Babbage", 45, new Address("5 Devonshire Street", "London", "W11")),
new Person("Alan Turing", 28, new Address("Bletchley Hall", "Bletchley Park", "MK12")),
new Person("Timothy Berners-Lee", 61, new Address("Colehill", "Wimborne", null))
);
collection.insertMany(people).subscribe(new OperationSubscriber<InsertManyResult>());

コレクションをクエリするには、 find()メソッドを使用できます。

次の例では、 コレクション内のすべてのPersonインスタンスを出力します。

collection.find().subscribe(new PrintToStringSubscriber<>());
Person{id='...', name='Ada Byron', age=20, address=Address{street='St James Square', city='London', zip='W1'}}
Person{id='...', name='Charles Babbage', age=45, address=Address{street='5 Devonshire Street', city='London', zip='W11'}}
Person{id='...', name='Alan Turing', age=28, address=Address{street='Bletchley Hall', city='Bletchley Park', zip='MK12'}}
Person{id='...', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}

特定の条件に一致するPersonインスタンスをクエリするには、フィルター オブジェクトをfind()メソッドに渡します。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー メソッドを提供します。

重要

POJO をクエリする場合は、POJO プロパティ名ではなく、ドキュメント フィールド名に対してクエリを実行する必要があります。 デフォルトでは同じですが、POJO プロパティ名がマッピングされる方法を変更することもできます。

次の例では、 eq()フィルタ オブジェクトを渡して等価条件を指定し、 address.city値がWimborneである最初のPersonを検索します。

collection.find(eq("address.city", "Wimborne"))
.first()
.subscribe(new PrintToStringSubscriber<>());
Person{id='591dbc2550852fa685b3ad1a', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}

次の例では、 ageの値が30より大きいすべてのドキュメントを出力します。

collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());

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

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

  • 更新するドキュメントを決定するためのフィルター オブジェクト。 空のフィルターを指定してすべてのPersonインスタンスを一致させるには、空のDocumentオブジェクトを使用します。

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

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

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

次の例では、経過時間をPerson "Ada Byron"23に、名前を に設定して、 という名前の"Ada Lovelace" を更新します。

collection.updateOne(
eq("name", "Ada Byron"),
combine(set("age", 23), set("name", "Ada Lovelace"))
).subscribe(new OperationSubscriber<>());

フィルターに一致するすべてのPersonインスタンスを更新するには、 updateMany()メソッドを使用します。

次の例では、 zip値を持つすべてのドキュメントで、 zipフィールドをnullに設定します。

collection.updateMany(not(eq("zip", null)), set("zip", null))
.subscribe(new OperationSubscriber<>());

既存のPersonインスタンスを変更する別の方法は、 replaceOne()メソッドを使用することです。

次の例では、 前述の insertOne の例Person "Ada Lovelace"Personで、 という名前の を、ada 変数が参照する インスタンスに置き換えます。

collection.replaceOne(eq("name", "Ada Lovelace"), ada)
.subscribe(new OperationSubscriber<>());

コレクションからドキュメントを削除するには、コレクションのdeleteOne() メソッドとdeleteMany() メソッドを使用できます。

削除するドキュメントに一致するようにフィルター オブジェクトを渡します。 空のフィルターを指定するには、空のDocumentオブジェクトを使用します。

削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供するDeleteResultタイプが返されます。

フィルターに一致する単一のPersonを削除するには、 deleteOne()メソッドを使用します。

次の例では、 address.city値がWimborneである 1 つのPersonを削除します。

collection.deleteOne(eq("address.city", "Wimborne"))
.subscribe(new OperationSubscriber<>());

フィルターに一致する複数のPersonインスタンスを削除するには、 deleteMany()メソッドを使用します。

次の例では、 address.cityの値がLondonであるすべてのPersonインスタンスを削除しています。

collection.deleteMany(eq("address.city", "London"))
.subscribe(new OperationSubscriber<>());

戻る

ドライバー アーティファクトの署名の検証