Docs Menu
Docs Home
/ / /
Scala
/

Macros

項目一覧

  • Overview
  • コーデックの作成
  • シードリストと Aかつ
  • オプションと値なし
  • 代替フィールド名

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 )

階層的なクラス構造は、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)

戻る

ドキュメント