POJO CRUD 操作例
項目一覧
このガイドでは、汎用の 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 の完全なコードをコピーします。
カスタム 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<>());