MongoDB에서 값을 마샬링/언 마샬링 할 때 값을 변경하거나 형식 변환을 수행하려면 사용자 지정 마샬링/마샬링 논리를 구현하여 값을 변환 할 수 있습니다.
bson.Getter
및 bson.Setter
인터페이스를 구현하면됩니다. 이러한 메서드 내에서 마샬링/언 마샬링되는 값으로 원하는대로 할 수 있습니다.
가장 쉬운
유형 time.Time
이 될 것입니다 추가 필드, 한 개 clientConfigData
유형을 확장하는 것입니다, 값이 필요합니다
type clientConfigData struct {
SMTPAssoc int `bson:"smtp_assoc"`
PlanType string `bson:"plan_type"`
EndDateStr string `bson:"end_date"`
EndDate time.Time `bson:"-"`
}
우리가이 원하지 않는 때문에, 태그 값 bson:"-"
있다 MongoDB에 나타납니다.
여기 발생
SetBSON()
가 MongoDB를에서 나오는 원시 값으로 구조체의 값을 "채우기"할 책임이 있다는 것입니다 무엇
const endDateLayout = "2006-01-02 15:04:05" // Use your layout here
func (c *clientConfigData) SetBSON(raw bson.Raw) (err error) {
type my clientConfigData
if err = raw.Unmarshal((*my)(c)); err != nil {
return
}
c.EndDate, err = time.Parse(endDateLayout, c.EndDateStr)
return
}
func (c *clientConfigData) GetBSON() (interface{}, error) {
c.EndDateStr = c.EndDate.Format(endDateLayout)
type my *clientConfigData
return my(c), nil
}
및 GetBSON()
가를 제공 할 책임이있다 :
이제 사용자 지정 마샬링/unmarhsaling 논리
저장하려는 값 (마샬링 됨).
로드 할 때 다음 DB (EndDateStr
)로부터 제공된 string
날짜 값으로부터 제 SetBSON()
마샬링 그대로 다음 제대로 (time.Time
의 유형 임)를 설정 EndDate
필드 값.
저장시 : GetBSON()
은 EndDate
필드에서 GetBSON()
필드 (저장되어있는 필드)를 먼저 채우고 저장하면됩니다.
두 가지주의 사항 : SetBSON()
및 GetBSON()
은 모두 내부에 my
유형을 새로 만듭니다. 그 이유는 스택 오버 플로우를 피하기 위해서입니다. 단순히 clientConfigData
유형의 값을 반환하는 것은 bson.Getter
및 bson.Setter
을 구현했기 때문에 SetBSON()
및 GetBSON()
이 끝없이 호출됩니다. 새 my
형식에는 이러한 메서드가 없으므로 무한한 "재귀"가 발생하지 않습니다. type
키워드는 새 형식을 만들고 기본 형식의 메서드를 "상속하지"않습니다. 그래서 우리는 구현하지 않은 경우 Set default date when inserting document with time.Time field
는'bson.Getter'하고'bson.Setter' 우리가 단순히'clienConfigData' 잘 반환 할 수 있습니다
또한/관련 비슷한 질문을 볼? 그러나이 경우에 우리는 더 잘하지 않습니다. 이 올바른지? –
'GetBSON()'과'SetBSON()'**을 추가하는 것은 ** Getter와 Setter를 구현하는 것입니다 ('Getter'와'Setter'는'GetBSON()을 정의하는 인터페이스입니다.)'및'SetBSON()').이러한 메소드를 추가하지 않으면 리턴 할 항목이 없습니다. – icza
고마워요 @icza –