POJO CRUD 操作例
項目一覧
このガイドでは、汎用の 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のドライバーソースリポジトリから
Person
POJO とAddress
POJO の完全なコードをコピーします。
カスタム 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<>());