Docs Menu
Docs Home
/ / /
Java 同期
/ /

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

項目一覧

  • 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()
@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]

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

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