文档菜单
文档首页
/ / /
Scala
/

宏定义

本页

  • 概述
  • 创建编解码器
  • 密封类和ADT
  • 选项和空值
  • 替代字段名

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 )

通过密封特性和类支持层次类结构。每个子类都由生成的编解码器特别处理,因此您只需为父密封特性和类创建一个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值始终被存储。在驱动程序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)

返回

文档