ドキュメントのデータ形式: レコード
項目一覧
Overview
このガイドでは、 Java レコードを使用して MongoDB Java ドライバー にデータを保存および検索する方法を学習します。 Java レコードは、データをモデル化し、ビジネス ロジックをデータ表現から分離するためによく使用される Java クラスのタイプです。
Tip
Java レコードは Java 16以降で宣言できます。 レコードの機能と制限の詳細については、 Java17 言語更新: クラスのレコード を参照してください。
Java の以前のバージョンを使用している場合は、代わりに Plain Old Java オブジェクトを使用できます。 実装の詳細については、「 ドキュメント データ形式: POJOのガイド 」を参照してください。
注意
OSG コンテナでドライバーを使用しており、アプリケーションでドライバーを使用して Java レコードをエンコードまたはデコードする場合は、 org.bson.codecs.record
モジュールに明示的な依存関係を追加する必要があります。 OSGi コンテナの依存関係の定義の詳細については、 IBM OSGi ドキュメント を参照してください。
レコードの直列化と逆直列化
ドライバーは、デフォルトの コーデック レジストリを使用して MongoDB の読み取りおよび書込み (write) 操作の Java レコードのエンコードとデコードをネイティブでサポートしています。 デフォルトのコーデック レジストリは、Java 型をエンコードおよびデコードする方法を定義するコーデックと呼ばれるクラスのコレクションです。 コーデックとデフォルトのコーデック レジストリの詳細については、「 コーデック に関するガイド」を参照してください。
サンプル レコード
このセクションのコード例では、データ ストレージ デバイスを説明する次のサンプル レコードを参照します。
public record DataStorageRecord( String productName, double capacity ) {}
レコードの挿入
次のコードに示すように、 DataStorageRecord
インスタンスを挿入できます。
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // insert the record collection.insertOne(new DataStorageRecord("2TB SSD", 1.71));
レコードの検索
次のコードに示すように、ドキュメントをDataStorageRecord
インスタンスとして取得し、印刷できます。
MongoCollection<DataStorageRecord> collection = database.getCollection("data_storage_devices", DataStorageRecord.class); // retrieve and print the records List<DataStorageRecord> records = new ArrayList<DataStorageRecord>(); collection.find().into(records); records.forEach(System.out::println);
DataStorageRecord[productName=1TB SSD, capacity=1.71]
注釈を使用したコンポーネント変換の指定
このセクションでは、レコード コンポーネントの直列化動作を構成するために使用できる注釈について説明し、注釈の動作を示す例を示します。
Tip
org.bson.codecs.records.annotations
パッケージは非推奨です。 org.bson.codecs.pojo.annotations からの同等のものを使用します パッケージを使用してください。
レコード コンポーネントには、次の注釈を使用できます。
注釈名 | 説明 |
---|---|
BsonId | シリアル化するコンポーネントを _id プロパティとして指定します。 |
BsonProperty | レコード コンポーネントを BSON に変換する時のカスタム ドキュメント フィールド名を指定します。 フィールド名をパラメーターとして受け入れます。 |
BsonRepresentation | レコード コンポーネントの型と異なる場合に保存する BSON の型を指定します。 パラメーターとして BSON 型を受け入れます。 |
注意
ドライバーは Java レコードの注釈をサポートしていますが、次のサンプル レコードに示すように、 コンポーネントを定義する ときにそれを含めた場合のみ。 レコード コンストラクター 内では注釈は使用できません。
注釈付きレコードの例
このセクションのコード例では、ネットワーク デバイスを説明する次のサンプル レコードを参照します。
import org.bson.BsonType; import org.bson.codecs.pojo.annotations.BsonProperty; import org.bson.codecs.pojo.annotations.BsonId; import org.bson.codecs.pojo.annotations.BsonRepresentation; public record NetworkDeviceRecord( @BsonId() String deviceId, String name, String deviceType ) {}
注釈付きレコードの挿入
次のコードに示すように、 DataStorageRecord
インスタンスを挿入できます。
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // insert the record String deviceId = new ObjectId().toHexString(); collection.insertOne(new NetworkDeviceRecord(deviceId, "Enterprise Wi-fi", "router"));
MongoDB に挿入されたドキュメントは、次のようになります。
{ _id: ObjectId("fedc..."), name: 'Enterprise Wi-fi', type: 'router' }
注釈付きのレコードの検索
次のコードに示すように、ドキュメントをNetworkDeviceRecord
インスタンスとして取得し、印刷できます。
MongoCollection<NetworkDeviceRecord> collection = database.getCollection("network_devices", NetworkDeviceRecord.class); // return all documents in the collection as records List<NetworkDeviceRecord> records = new ArrayList<NetworkDeviceRecord>(); collection.find().into(records); records.forEach(System.out::println);
NetworkDeviceRecord[deviceId=fedc..., name=Enterprise Wi-fi, deviceType=router]
再帰型による操作
ドライバーは、ランタイム再帰を発生させずに、再帰的に定義されたレコードのエンコードとデコードをネイティブでサポートしています。 このサポートは、タイプ定義内の複数のレコードタイプのサイクルに拡張されます。 次のコードは、再帰レコードの設計の例を示しています。
public record RecordTree( String content, RecordTree left, RecordTree right ) {}
再帰的に定義されたレコードに対して、他のレコードと同様に読み取りおよび書込み操作を実行できます。 次のコードは、 RecordTree
型のコレクションに対して検索操作を実行する方法を示しています。
MongoDatabase database = mongoClient.getDatabase("myDB"); MongoCollection<RecordTree> collection = database.getCollection("myCollection", RecordTree.class); Bson filter = Filters.eq("left.left.right.content", "Ikatere"); collection.find(filter).forEach(doc -> System.out.println(doc));
RecordTree[content=Ranginui, left=RecordTree[content=..., left=RecordTree[content=..., right=RecordTree[content=Ikatere...]]
レコード コーデックの取得
レコード コーデックを検索するには、 RecordCodecProvider
を使用します。 重複コードを最小限に抑えながら、対応する との間で レコード オブジェクトをエンコードおよびデコードするようにコーデックをカスタマイズする場合は、このインターフェースを使用する必要があります。JavaBSON typesコーデックとその使用方法の詳細については、「コーデック 」を参照してください。
レコード コーデックを直接作成することはできませんが、 RecordCodecProvider
を使用してコードにレコード コーデックを実装できます。 RecordCodecProvider
の詳細については、 API ドキュメントを参照してください。