문서 메뉴
문서 홈
/ / /
Scala
/

매크로

이 페이지의 내용

  • 개요
  • 코덱 만들기
  • 봉인된 클래스 및 ADT
  • 옵션 및 없음 값
  • 대체 필드 이름

Scala 드라이버를 사용하면 케이스 클래스를 사용하여 Macros 헬퍼를 통해 컬렉션의 문서를 표현할 수 있습니다. 간단한 케이스 클래스와 중첩된 케이스 클래스가 지원됩니다. 계층적 모델링은 봉인된 트레이트 또는 클래스를 사용한 다음 케이스 클래스가 상위 트레이트를 구현하도록 함으로써 달성할 수 있습니다.

많은 간단한 스칼라 유형이 지원되며 해당 BsonValue 유형으로 마셜링될 수 있습니다. 다음 목록에서는 스칼라 유형과 해당 유형의 안전한 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 )

계층적 클래스 구조는 봉인된 트레이트와 클래스를 통해 지원됩니다. 각 하위 클래스는 생성된 코덱에 의해 구체적으로 처리되므로 상위 봉인된 트레이트 또는 클래스에 대해 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)

돌아가기

문서