このガイドでは、汎用の Documentクラスではなく、Plain Old Java Objects(POJO)を使用してドキュメントをモデル化します。
このガイドのコード例は、ドライバーソースコードGithubリポジトリ内の PojoQuickTour.javaファイルから取得されています。
重要
このガイドでは、カスタム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のドライバーソースリポジトリから
PersonPOJO とAddressPOJO の完全なコードをコピーします。
カスタム CodecRegistry の作成
ドライバーで POJO を使用する前に、POJO の BSON との間の変換を処理するコーデックを含むようにCodecRegistryを構成する必要があります。 その最も簡単な方法は、 PojoCodecProvider.builder()メソッドを使用してCodecProviderを作成および構成することです。
次の例では、デフォルトのコーデック レジストリと POJO Codecインスタンスを自動的に作成するように構成されたPojoCodecProviderを組み合わせています。
CodecRegistry pojoCodecRegistry = fromRegistries( MongoClientSettings.getDefaultCodecRegistry(), fromProviders(PojoCodecProvider.builder().automatic(true).build()) );
注意
リクエストされたクラスのコーデックが返されるまで、レジストリは順番にチェックされます。 DefaultCodecRegistryはリストの最初である必要があり、 PojoCodecProviderは常に最後のCodecProviderである必要があります。これは、ほとんどすべてのクラスでコーデックを提供できるためです。
CodecRegistry の使用
次のリストでは、使用するようにpojoCodecRegistryを設定する方法を説明します。
MongoClientオブジェクトをインスタンス化するときに設定します。MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .build(); MongoClient mongoClient = MongoClients.create(settings); 代替の
CodecRegistryとMongoDatabaseを使用する。database = database.withCodecRegistry(pojoCodecRegistry); 代替の
CodecRegistryとMongoCollectionを使用する。collection = collection.withCodecRegistry(pojoCodecRegistry);
MongoDB への POJO の挿入
コーデック レジストリは自動的に不明なクラス用の 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<>());
Update Documents
コレクション内のドキュメントを更新するには、コレクションの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<>());
Delete Documents
コレクションからドキュメントを削除するには、コレクションのdeleteOne() メソッドとdeleteMany() メソッドを使用できます。
削除するドキュメントに一致するようにフィルター オブジェクトを渡します。 空のフィルターを指定するには、空のDocumentオブジェクトを使用します。
削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供するDeleteResultタイプが返されます。
フィルターに一致する 1 人のユーザーを削除
フィルターに一致する単一の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<>());