AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

POJO を使用したデータのモデル化

このガイドでは、 Java Reactive Streams ドライバーを使用して、Plain Old Java Object(POJO)によってモデル化されたデータを保存および検索する方法を学習できます。 POJO は、ビジネス ロジックをデータ表現から分離するデータ カプセル化によく使用されます。

このガイドでは、次のタスクを実行する方法について説明しています。

  • POJO をシリアル化およびデシリアル化するようにドライバーを構成する

  • POJOでモデル化されたデータを使用してCRUD操作を実行

重要

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

このガイドの例では、PersonAddress 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; }
@Override
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; }
@Override
public String toString() {
return "Address{"
+ "street='" + street + "'"
+ ", city='" + city + "'"
+ ", zip='" + zip + "'"
+ "}";
}
}

POJOクラスを定義するときは、次の要件を満たしていることを確認してください。

  • POJO クラスは、インターフェースを実装したり、フレームワークからクラスを拡張したりすることはできません。

  • データを保存および取得するフィールドをすべて含め、それらが static または transient としてマークされていないことを確認します。

  • JavaBuild の命名規則に従って公開 getter メソッドまたは setter メソッドを含めると、ドライバーはデータを直列化または逆直列化するときにそれらを呼び出します。パブリックフィールドの getter メソッドまたは setter メソッドを省略すると、ドライバーはそれらに直接アクセスするか、割り当てます。

Java Reactive Streams ドライバーで POJO を使用する前に、カスタム CodecRegistry を作成して、POJO をシリアル化およびデシリアル化するように構成する必要があります。次の手順は、CodecRegistry を作成し、クライアント、データベース、またはコレクションに適用する方法を示します。

1

次のコードでは、PojoCodecProvider.Builderクラスの automatic(true) 設定を使用して、POJO コーデックを任意のクラスとそのプロパティに自動的に適用します。

CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
2

次のコードに示すように、デフォルトのコーデック レジストリと PojoCodecProvider を組み合わせた CodecRegistry を作成します。

CodecRegistry pojoCodecRegistry = fromRegistries(
getDefaultCodecRegistry(),
fromProviders(pojoCodecProvider)
);

注意

リクエストされたクラスのコーデックが返されるまで、レジストリは順番にチェックされます。デフォルトのコーデック レジストリをリストの最初に含め、最後に PojoCodecProvider を含めると、ほぼすべてのクラスのコーデックを提供できるためです。

3

カスタム CodecRegistry を使用するには、MongoClientMongoDatabase、または MongoCollectionインスタンスを構成します。コーデック レジストリは、次のいずれかの方法で設定できます。

  1. MongoClientCodecRegistry を設定する。

    MongoClientSettings settings = MongoClientSettings.builder()
    .codecRegistry(pojoCodecRegistry)
    .build();
  2. MongoDatabaseCodecRegistry を設定する。

    MongoDatabase database = mongoClient.getDatabase("mydb").withCodecRegistry(pojoCodecRegistry);
  3. MongoCollectionCodecRegistry を設定する。

    MongoCollection<org.bson.Document> rawCollection = database.getCollection("people").withCodecRegistry(pojoCodecRegistry);
4

次のコードに示すように、POJOクラスをドキュメントクラスパラメータとして getCollection() に渡し、それを MongoCollectionインスタンスの型引数として指定します。

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

Person POJO を使用するようにドライバーを構成すると、POJO によってモデル化されたデータに対してCRUD操作を実行できます。

コーデック レジストリは不明なクラス用の 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プロパティ名をマッピングする方法を変更することもできます。

フィルターに一致する最初の 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 タイプを返します。

フィルターに一致する単一の 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<>());

既存の Personインスタンスを完全に置き換えるには、replaceOne() メソッドを使用します。

次の例では、nameフィールドの値が "Ada Lovelace" である Personインスタンスを、ada 変数が参照する Person に置き換えます。

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

コレクションからドキュメントを削除するには 、deleteOne() メソッドと deleteMany() メソッドを使用します。削除するドキュメントに一致するようにフィルターオブジェクトを渡します。

削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供する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<>());

このガイドで言及されているCRUD操作について詳しくは、 「 CRUD操作 」セクションを参照してください。

このガイドで言及されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。