Docs Menu
Docs Home
/ /

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

このガイドでは、 Java レコードを使用して MongoDB Java ドライバー にデータを保存および検索する方法を学習します。 Java レコードは、データをモデル化し、ビジネス ロジックをデータ表現から分離するためによく使用される Java クラスのタイプです。

Tip

JavaレコードはJava 16 以降で宣言できます。レコードの機能と制限の詳細については、Java 17 言語更新: クラスのレコード を参照してください。

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]

このセクションでは、注釈を使用してレコードコンポーネントの直列化動作を構成する方法について説明します。サポートされている注釈の完全なリストについては、org.bson.codecs.pojo.annotationsパッケージAPIドキュメントを参照してください。

注意

ドライバーは 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()
@BsonRepresentation(BsonType.OBJECT_ID)
String deviceId,
String name,
@BsonProperty("type")
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]

注意

org.bson.codecs.records.annotationsパッケージは非推奨です。代わりに、 org.bson.codecs.pojo.annotationsパッケージからの同等の注釈を使用します。

ドライバーは、ランタイム再帰を発生させずに、再帰的に定義されたレコードのエンコードとデコードをネイティブでサポートしています。 このサポートは、タイプ定義内の複数のレコードタイプのサイクルに拡張されます。 次のコードは、再帰レコードの設計の例を示しています。

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ドキュメントを参照してください。

戻る

POJO カスタマイズ

項目一覧