Docs 菜单
Docs 主页
/ / /
Scala
/

在此页面上

  • Overview
  • 创建编解码器
  • 密封类和 ADT
  • 选项和无值
  • 备用字段名称

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()方法创建CodecProviderCodecProvider将配置的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 )

通过密封特征和类支持分层类结构。 每个子类均由生成的编解码器专门处理,因此您只需为父密封特征或类创建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)

后退

文档 (Document)