Overview
このガイドでは、 Java Reactive Streams ドライバーを使用して、Plain Old Java Object(POJO)によってモデル化されたデータを保存および検索する方法を学習できます。 POJO は、ビジネス ロジックをデータ表現から分離するデータ カプセル化によく使用されます。
Tip
POJO について詳しくは、Wikipedia で Plain old Java オブジェクトエントリを参照してください。
このガイドでは、次のタスクを実行する方法について説明しています。
POJO をシリアル化およびデシリアル化するようにドライバーを構成する
POJOでモデル化されたデータを使用してCRUD操作を実行
重要
このガイドでは、サンプル カスタム サブスクリプション実装ガイドで説明されているカスタムSubscriber実装を使用します。
サンプル POJO
このガイドの例では、Person と Address POJO クラスを使用して、people という名前のサンプルコレクション内のドキュメントをモデル化します。
Personクラスには、人の名前、年数、住所が保存されています。このクラスには、次の定義があります。
import org.bson.types.ObjectId; public final class Person { private ObjectId id; private String name; private int age; private Address address; public Person() {} public Person(final String name, final int age, final Address address) { this.name = name; this.age = age; this.address = address; } public ObjectId getId() { return id; } public void setId(final ObjectId id) { this.id = id; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public int getAge() { return age; } public void setAge(final int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(final Address address) { this.address = address; } public String toString() { return "Person{" + "id='" + id + "'" + ", name='" + name + "'" + ", age=" + age + ", address=" + address + "}"; } }
Addressクラスには、住所、都市、郵便番号が保存されています。このクラスには、次の定義があります。
public final class Address { private String street; private String city; private String zip; public Address() {} public Address(final String street, final String city, final String zip) { this.street = street; this.city = city; this.zip = zip; } public String getStreet() { return street; } public void setStreet(final String street) { this.street = street; } public String getCity() { return city; } public void setCity(final String city) { this.city = city; } public String getZip() { return zip; } public void setZip(final String zip) { this.zip = zip; } public String toString() { return "Address{" + "street='" + street + "'" + ", city='" + city + "'" + ", zip='" + zip + "'" + "}"; } }
POJOクラスを定義するときは、次の要件を満たしていることを確認してください。
POJO クラスは、インターフェースを実装したり、フレームワークからクラスを拡張したりすることはできません。
データを保存および取得するフィールドをすべて含め、それらが
staticまたはtransientとしてマークされていないことを確認します。JavaBuild の命名規則に従って公開 getter メソッドまたは setter メソッドを含めると、ドライバーはデータを直列化または逆直列化するときにそれらを呼び出します。パブリックフィールドの getter メソッドまたは setter メソッドを省略すると、ドライバーはそれらに直接アクセスするか、割り当てます。
POJO のドライバーの設定
Java Reactive Streams ドライバーで POJO を使用する前に、カスタム CodecRegistry を作成して、POJO をシリアル化およびデシリアル化するように構成する必要があります。次の手順は、CodecRegistry を作成し、クライアント、データベース、またはコレクションに適用する方法を示します。
を作成します。CodecRegistry
次のコードに示すように、デフォルトのコーデック レジストリと PojoCodecProvider を組み合わせた CodecRegistry を作成します。
CodecRegistry pojoCodecRegistry = fromRegistries( getDefaultCodecRegistry(), fromProviders(pojoCodecProvider) );
注意
リクエストされたクラスのコーデックが返されるまで、レジストリは順番にチェックされます。デフォルトのコーデック レジストリをリストの最初に含め、最後に PojoCodecProvider を含めると、ほぼすべてのクラスのコーデックを提供できるためです。
CodecRegistryを適用します。
カスタム CodecRegistry を使用するには、MongoClient、MongoDatabase、または MongoCollectionインスタンスを構成します。コーデック レジストリは、次のいずれかの方法で設定できます。
MongoClientにCodecRegistryを設定する。MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(pojoCodecRegistry) .build(); MongoDatabaseにCodecRegistryを設定する。MongoDatabase database = mongoClient.getDatabase("mydb").withCodecRegistry(pojoCodecRegistry); MongoCollectionにCodecRegistryを設定する。MongoCollection<org.bson.Document> rawCollection = database.getCollection("people").withCodecRegistry(pojoCodecRegistry);
CRUD 操作を実行
Person POJO を使用するようにドライバーを構成すると、POJO によってモデル化されたデータに対してCRUD操作を実行できます。
Insert Data
コーデック レジストリは不明なクラス用の POJO Codec を自動的に作成するため、追加の構成なしで POJO をそのまま使用できます。
コレクションに単一の Person を挿入するには、insertOne() メソッドを呼び出し、その結果をサブスクライブします。次の例では、ada という名前の Personインスタンスを peopleコレクションに挿入します。
Person ada = new Person("Ada Byron", 20, new Address("St James Square", "London", "W1")); collection.insertOne(ada).subscribe(new OperationSubscriber<InsertOneResult>());
複数の Person インスタンスを挿入するには、次の例に示すように、insertMany() メソッドを呼び出し、 インスタンスのリストを渡します。
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() メソッドを使用します。フィルターオブジェクトをfind() メソッドに渡すと、特定の条件に一致するドキュメントを検索できます。このドライバーでは、フィルター オブジェクトの作成に使用できる Filtersヘルパーメソッドが提供されています。
重要
POJO をクエリする場合は、POJOプロパティ名ではなく、ドキュメントフィールド名に対してクエリを実行する必要があります。デフォルトでは同じですが、ドライバーが POJOプロパティ名をマッピングする方法を変更することもできます。
Retrieve One
フィルターに一致する最初の Personインスタンスを取得するには、find()操作の結果に対して first() メソッドを呼び出します。
次の例では、address.cityフィールド値が "Wimborne" である最初の Personインスタンスを検索します。
collection.find(eq("address.city", "Wimborne")) .first() .subscribe(new PrintToStringSubscriber<>());
Person{id='...', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
複数検索
フィルターに一致するすべての Person インスタンスを検索するには、find() メソッドを呼び出して結果にサブスクライブします。
次の例では、ageフィールドの値が 30 より大きいすべての Personインスタンスを検索します。
collection.find(gt("age", 30)).subscribe(new PrintToStringSubscriber<>());
Person{id='...', name='Charles Babbage', age=45, address=Address{street='5 Devonshire Street', city='London', zip='W11'}} Person{id='...', name='Timothy Berners-Lee', age=61, address=Address{street='Colehill', city='Wimborne', zip='null'}}
データの更新
コレクション内のドキュメントを更新するには、updateOne() メソッドと updateMany() メソッドを使用します。これらのメソッドに次のパラメータを渡します。
更新するドキュメントを指定するフィルターオブジェクト。
変更を指定するドキュメントを更新します。使用可能な演算子のリストを表示するには、 MongoDB Serverマニュアルの「 更新演算子 」を参照してください。
アップデート メソッドは、変更されたドキュメントの数など、操作に関する情報を提供する UpdateResult タイプを返します。
更新 1
フィルターに一致する単一の Personインスタンスを更新するには、updateOne() メソッドを使用します。
次の例では、 ageフィールド値を 23 に設定し、nameフィールド値を "Ada Lovelace" に設定して、"Ada Byron" という名前の Person を更新します。
collection.updateOne( eq("name", "Ada Byron"), combine(set("age", 23), set("name", "Ada Lovelace")) ).subscribe(new OperationSubscriber<>());
複数更新
フィルターに一致するすべてのPersonインスタンスを更新するには、 updateMany()メソッドを使用します。
次の例では、null 以外の zip 値を持つすべての Person インスタンスの zipフィールド値を null に設定します。
collection.updateMany(not(eq("zip", null)), set("zip", null)) .subscribe(new OperationSubscriber<>());
replaceOne
既存の Personインスタンスを完全に置き換えるには、replaceOne() メソッドを使用します。
次の例では、nameフィールドの値が "Ada Lovelace" である Personインスタンスを、ada 変数が参照する Person に置き換えます。
collection.replaceOne(eq("name", "Ada Lovelace"), ada) .subscribe(new OperationSubscriber<>());
データの削除
コレクションからドキュメントを削除するには 、deleteOne() メソッドと deleteMany() メソッドを使用します。削除するドキュメントに一致するようにフィルターオブジェクトを渡します。
削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供するDeleteResultタイプが返されます。
deleteOne
フィルターに一致する単一の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<>());
詳細情報
このガイドで言及されているCRUD操作について詳しくは、 「 CRUD操作 」セクションを参照してください。
API ドキュメント
このガイドで言及されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。