宏定义
概述
Scala驱动程序允许您使用由宏辅助程序实现的case类来表示集合中的文档。支持简单的case类和嵌套的case类。可以通过使用密封特质或类,然后通过让case类实现父特质来实现分层建模。
支持许多简单的Scala类型,可以将它们序列化为相应的BsonValue
类型。以下列表描述了Scala类型及其类型安全的BSON表示
Scala类型 | BSON类型 |
---|---|
Case类 | 文档 |
可迭代对象 | 数组 |
日期 | 日期 |
布尔值 | 布尔值 |
双精度浮点数 | 双精度浮点数 |
整数 | 32位整数 |
长整数 | 64位整数 |
字符串 | 字符串 |
字节数组 | 二进制 |
空 | 空值 |
创建编解码器
要为您的case类创建编解码器,请使用Macros
对象辅助方法。您应该使用Macros.createCodecProvider()
方法创建CodecProvider
。一个CodecProvider
将配置的CodecRegistry
传递给底层的Codec
,并提供对所有配置的编解码器的访问。
要创建一个CodecProvider
,在调用createCodecProvider()
时设置case类类型,如下所示
import org.mongodb.scala.bson.codecs.Macros case class Person(firstName: String, secondName: String) val personCodecProvider = Macros.createCodecProvider[Person]()
然后可以使用personCodecProvider
,通过使用CodecRegistries
静态辅助程序将其转换为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 )
选项和None值
默认情况下,Option
值始终被存储。在驱动程序v2.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)