ドキュメントのデータ形式: POJO
Overview
このガイドでは、Plain Old Java Object(POJO)によってモデル化されたデータを保存および検索する方法を学習できます。POJO は、ビジネス ロジックをデータ表現から分離するデータ カプセル化によく使用されます。
Tip
POJO について詳しくは、Wikipedia で Plain Old Java オブジェクト の記事を参照してください。
このガイドの例では、次のタスクを実行する方法について説明しています。
POJO をシリアル化およびデシリアル化するようにドライバーを構成する
POJOでモデル化されたデータを使用してCRUD操作を実行する
POJO の例
このガイドのセクションでは、花の特性を説明する次のサンプル 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; } 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
としてマークされていないことを確認します。JavaBuild の命名規則 を使用して、公開 getter メソッドまたは setter メソッドを含める場合、 POJO では、ドライバーはデータをシリアル化または逆シリアル化するときにそれらを呼び出します。パブリック プロパティ フィールドの getter メソッドまたは setter メソッドを省略すると、ドライバーはそれらに直接アクセスするか、割り当てます。
POJO のドライバーの設定
POJO を使用するようにドライバーを構成するには、次のコンポーネントを指定する必要があります。
PojoCodecProvider
インスタンス: POJO 形式と BSON 間でデータをエンコードおよびデコードする方法を定義するコーデックを持ち、 コーデックが適用される POJO クラスやパッケージを指定します。CodecRegistry
コーデックやその他の関連情報が含まれるインスタンス。MongoDatabase
インスタンス、またはCodecRegistry
インスタンス。MongoCollection
を使用するために構成されたもの。MongoCollection
インスタンス。TDocument
ジェネリック型にバインドされた POJO ドキュメント クラスを使用して作成されたもの。
前のセクションで定義された構成要件を満たすには、次の手順を実行します。
PojoCodecProvider
を設定します。この例では、PojoCodecProvider.Builder
のautomatic(true)
設定を使用して、コーデックを任意のクラスとそのプロパティに適用します。CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build(); 注意
コーデック プロバイダーには、シリアル化の動作をさらに定義する
ClassModel
やConvention
インスタンスなどの他のオブジェクトも含まれています。コーデック プロバイダーとカスタマイズについて詳しくは、POJO カスタマイズのガイドを参照してください。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)); CodecRegistry
内のコーデックを使用するようにMongoDatabase
またはMongoCollection
インスタンスを構成します。コーデックを指定するには、データベースまたはコレクションのいずれかを構成できます。この例では、
withCodecRegistry()
メソッドを使用して、sample_pojos
と呼ばれるMongoDatabase
にCodecRegistry
を設定します。MongoClient mongoClient = MongoClients.create(uri); MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry); 次のコードに示すように、POJO クラスをドキュメント クラス パラメーターとして
getCollection()
の呼び出しに渡し、それをMongoCollection
インスタンスの型引数として指定します。MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);
CRUD 操作を実行
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 ドキュメントを参照してください。
概要
このガイドでは、次のタスクを実行して、BSON と POJO 形式間でデータを変換する方法について説明します。
BSON と POJO フィールド間でデータをエンコードおよびデコードする方法を定義するコーデックを含む
PojoCodecProvider
をインスタンス化します。PojoCodecProvider
の 自動 変換動作を指定して、Codecs
を任意のクラスとそのプロパティに適用します。PojoCodecProvider
をCodecRegistry
に追加し、MongoDatabase
またはMongoCollection
のインスタンスのレジストリを指定します。サンプル POJO クラスを使用する CRUD 操作を実行します。