매크로
개요
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
헬퍼에는 Class[T]
를 가져와서 CodecProvider
을 생성하는 암시적 createCodecProvider()
메서드도 있습니다. 이 메서드는 특히 여러 제공자를 정의할 때 더 간결합니다.
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
값은 항상 저장됩니다. 드라이버 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)