Docs Menu
Docs Home
/ /

ドキュメントのデータ形式: POJO

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

Tip

POJO について詳しくは、Wikipedia で Plain Old Java オブジェクト の記事を参照してください。

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

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

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

このガイドのセクションでは、花の特性を説明する次のサンプル POJO クラスを使用します。

public class Flower {
private ObjectId id;
private String name;
private List<String> colors;
private Boolean isBlooming;
private Float height;
// public empty constructor needed for retrieving the POJO
public Flower() {
}
public Flower(String name, Boolean isBlooming, Float height, List<String> colors) {
this.name = name;
this.isBlooming = isBlooming;
this.height = height;
this.colors = colors;
}
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIsBlooming() {
return isBlooming;
}
public void setIsBlooming(Boolean isBlooming) {
this.isBlooming = isBlooming;
}
public Float getHeight() {
return height;
}
public void setHeight(Float height) {
this.height = height;
}
public List<String> getColors() {
return colors;
}
public void setColors(List<String> colors) {
this.colors = colors;
}
@Override
public String toString() {
return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}";
}
}

MongoDB 内でデータを保存および検索するための POJO を定義する場合は、次のガイドラインに従います。

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

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

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

POJO を使用するようにドライバーを構成するには、次のコンポーネントを指定する必要があります。

  • PojoCodecProvider インスタンス: POJO 形式と BSON 間でデータをエンコードおよびデコードする方法を定義するコーデックを持ち、 コーデックが適用される POJO クラスやパッケージを指定します。

  • CodecRegistry コーデックやその他の関連情報が含まれるインスタンス。

  • MongoDatabase インスタンス、または CodecRegistry インスタンス。MongoCollection を使用するために構成されたもの。

  • MongoCollection インスタンス。TDocument ジェネリック型にバインドされた POJO ドキュメント クラスを使用して作成されたもの。

前のセクションで定義された構成要件を満たすには、次の手順を実行します。

  1. PojoCodecProviderを設定します。この例では、PojoCodecProvider.Builderautomatic(true) 設定を使用して、コーデックを任意のクラスとそのプロパティに適用します。

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

    注意

    コーデック プロバイダーには、シリアル化の動作をさらに定義する ClassModelConvention インスタンスなどの他のオブジェクトも含まれています。コーデック プロバイダーとカスタマイズについて詳しくは、POJO カスタマイズのガイドを参照してください。

  2. PojoCodecProvider インスタンスを CodecRegistry に追加します。CodecRegistry を使用すると、POJO データをエンコードするための 1 つ以上のコーデック プロバイダーを指定できます。この例では、次のメソッドを呼び出します。

    • fromRegistries() 。複数の CodecRegistry インスタンスを 1 つのインスタンスにまとめるためのもの。

    • getDefaultCodecRegistry() コーデックプロバイダのリストから CodecRegistry インスタンスを検索する

    • fromProviders() PojoCodecProvider から CodecRegistry インスタンスを作成する

    次のコードは、CodecRegistry をインスタンス化する方法を示しています。

    // Include the following static imports before your class definition
    import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;
    import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
    import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
    ...
    CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
  3. CodecRegistry 内のコーデックを使用するように MongoDatabase または MongoCollection インスタンスを構成します。コーデックを指定するには、データベースまたはコレクションのいずれかを構成できます。

    この例では、withCodecRegistry() メソッドを使用して、sample_pojos と呼ばれる MongoDatabaseCodecRegistry を設定します。

    MongoClient mongoClient = MongoClients.create(uri);
    MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry);
  4. 次のコードに示すように、POJO クラスをドキュメント クラス パラメーターとして getCollection() の呼び出しに渡し、それを MongoCollection インスタンスの型引数として指定します。

    MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);

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

この例では、Flower POJO を使用して次の操作を実行する方法を示します。

  • Flower のインスタンスを flowers コレクションに挿入します

  • コレクション内のドキュメントを更新する

  • コレクション内のドキュメントを削除する

  • コレクション内のすべてのドキュメントを検索して印刷する

// Insert three Flower instances
Flower roseFlower = new Flower("rose", false, 25.4f, Arrays.asList(new String[] {"red", "pink"}));
Flower daisyFlower = new Flower("daisy", true, 21.1f, Arrays.asList(new String[] {"purple", "white"}));
Flower peonyFlower = new Flower("peony", false, 19.2f, Arrays.asList(new String[] {"red", "green"}));
collection.insertMany(Arrays.asList(roseFlower, daisyFlower, peonyFlower));
// Update a document
collection.updateOne(
Filters.lte("height", 22),
Updates.addToSet("colors", "pink")
);
// Delete a document
collection.deleteOne(Filters.eq("name", "rose"));
// Return and print all documents in the collection
List<Flower> flowers = new ArrayList<>();
collection.find().into(flowers);
System.out.println(flowers);

この例では、次の出力が印刷されます。

[
Flower {
id: 65b178ffa38ac42044ca1573
name: daisy
colors: [purple, white, pink]
isBlooming: true
height: 21.1
},
Flower {
id: 65b178ffa38ac42044ca1574
name: peony
colors: [red, green]
isBlooming: false
height: 19.2
}]

注意

デフォルトでは、PojoCodecProvider は POJO 内の null に設定されているフィールドを省略します。この動作を指定する方法について詳しくは、POJO カスタマイズのガイドを参照してください。

このセクションで説明されるメソッドとクラスの詳細については、次の API ドキュメントを参照してください。

このセクションでは、 MongoDBに POJO を保存するときに発生し得る質問に答えます。

いいえ、 PojoCodecProviderは ObjectId を自動的に生成します。

はい。その例については、 Githubでの実装 を参照してください。

はい、弁別子を使用します。詳細については、 POJO カスタマイズガイドの「 識別子 」セクションを参照してください。

いいえ。ネイティブ POJO コーデックでは、ゲッターとセッターが各フィールドに対して同じ修飾子を持つことを前提としています。

たとえば、次のメソッドはエンコード中に の例外をスローします。

private String getField();
public String setField(String x);

この例外は、クラスのコーデックを登録する必要があることを意味します。

戻る

ドキュメント