宏
Overview
Scala 驱动程序允许您通过 Macros
辅助程序使用案例类来表示集合中的文档。 支持简单案例类和嵌套案例类。 可以通过使用密封特征或类,然后让案例类实现父特征来实现分层建模。
支持许多简单的Scala类型,并且可以将其编组为相应的BsonValue
类型。 以下列表描述了Scala类型及其类型安全的BSON表示形式:
Scala 类型 | BSON 类型 |
---|---|
Case 类 | 文档 |
Iterable | 阵列 |
Date | Date |
Boolean | 布尔 |
Double | double |
Int | Int32 |
Long | Int64 |
String | 字符串 |
Array[Byte] | 二进制文件 |
None | null |
创建编解码器
要为案例类创建编解码器,请使用Macros
对象辅助方法。 您应使用Macros.createCodecProvider()
方法创建CodecProvider
。 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
静态助手将personCodecProvider
转换为CodecRegistry
。 以下代码创建一个新的编解码器注册表,将新的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 )
密封类和 ADT
通过密封特征和类支持分层类结构。 每个子类均由生成的编解码器专门处理,因此您只需为父密封特征或类创建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)