Macros
Overview
Scala ドライバーでは、 Macros
ヘルパーを使用して、ケース クラスを使用してコレクション内のドキュメントを表すことができます。 単純なケース クラスとネストされたケース クラスはサポートされています。 階層モデリングは、閉じた特権または クラスを使用し、その後ケース クラスに親特権を実装させることで実行できます。
多くの単純な Scala タイプがサポートされており、対応するBsonValue
タイプにマーシャリングできます。 次のリストでは、Scala 型とその型安全性のある BSON 表現について説明します。
Scala 型 | BSON 型 |
---|---|
大文字と小文字のクラス | ドキュメント |
Iterable | 配列 |
Date | 日付 |
Boolean | ブール値 |
Double | Double |
Int | Int32 |
Long | Int64 |
String | 文字列 |
Array[Byte] | バイナリ |
None | null |
コーデックの作成
ケース クラスのコーデックを作成するには、 Macros
オブジェクト ヘルパー メソッドを使用します。 CodecProvider
を作成するには、 Macros.createCodecProvider()
メソッドを使用する必要があります。 CodecProvider
は構成されたCodecRegistry
を基礎となるCodec
に渡し、構成されたすべてのコーデックへのアクセスを提供します。
CodecProvider
を作成するには、次のコードに示すように、 createCodecProvider()
を呼び出すときに ケース クラスの型を設定します。
import org.mongodb.scala.bson.codecs.Macros case class Person(firstName: String, secondName: String) val personCodecProvider = Macros.createCodecProvider[Person]()
次に、 CodecRegistries
静的ヘルパーを使用してCodecRegistry
に変換されたときにpersonCodecProvider
を使用できます。 次のコードでは、新しいpersonCodecProvider
とデフォルトのコーデック レジストリを組み合わせて新しいコーデック レジストリを作成します。
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders} val codecRegistry = fromRegistries( fromProviders(personCodecProvider), DEFAULT_CODEC_REGISTRY )
また、 Macros
ヘルパーには暗黙的なcreateCodecProvider()
メソッドもあり、 Class[T]
を受け取り、それからCodecProvider
を作成します。 この方法は、特に複数のプロバイダーを定義する場合、より簡潔になります。
import org.mongodb.scala.bson.codecs.Macros._ import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders} case class Address(firstLine: String, secondLine: String, thirdLine: String, town: String, zipCode: String) case class ClubMember(person: Person, address: Address, paid: Boolean) val codecRegistry = fromRegistries( fromProviders(classOf[ClubMember], classOf[Person], classOf[Address]), DEFAULT_CODEC_REGISTRY )
シードリストと Aかつ
階層的なクラス構造は、shell と クラスによってサポートされています。 各サブクラスは生成されたコーデックによって特別に処理されるため、親のシード処理された特権またはクラスに対してCodecProvider
を作成する必要があるだけです。 内部的には、データをデコードするときに正しいサブクラスをハイライト化できるように、余計なフィールド( _t
)がデータと一緒に保存されます。 次のコードは、ブランチ ノードとリーフ ノードを含むツリーのような構造体の例えです。
sealed class Tree case class Branch(b1: Tree, b2: Tree, value: Int) extends Tree case class Leaf(value: Int) extends Tree val codecRegistry = fromRegistries( fromProviders(classOf[Tree]), DEFAULT_CODEC_REGISTRY )
オプションと値なし
デフォルトでは、 Option
値は常に保存されます。 ドライバー v 2.1.0では、 新しいヘルパーが追加され、 None
値がデータベースに保存されなくなりました。 次の例では、ドライバーはアドレスが存在する場合のみアドレスを保存します。
import org.mongodb.scala.bson.codecs.Macros case class Person(firstName: String, secondName: String, address: Option[Address]) val personCodecProvider = Macros.createCodecProviderIgnoreNone[Person]()
代替フィールド名
BsonProperty
アノテーションを使用すると、特定のプロパティに使用する BSON フィールドキーを構成できます。 次の例では、 BsonProperty
アノテーションを使用してfirstName
フィールドの保存方法を変更しています。
case class Person(@BsonProperty("first_name") firstName: String, secondName: String)