2017-02-20 1 views
1

에서 나는 다음과 같이 이동을 사용하여 MongoDB를 액세스하고 있습니다 :Accesing MongoDB를가 이동

type clientConfigData struct { 
    SMTPAssoc  int  `bson:"smtp_assoc"` 
    PlanType  string `bson:"plan_type"` 
    EndDate  string `bson:"end_date"` 
} 

는 이제 MongoDB의에서 EndDate 이후 string로 저장됩니다

var configRes *clientConfigData 
err := clientDB. 
    C(clientConfigCollection). 
    Find(bson.M{}). 
    One(&configRes) 
if err != nil { 
    return nil, errors.Wrap(err, "finding config collection") 
} 

은 그래서 stringEndDate을 선언했다. 하지만 Go TimeclientConfigData으로이 날짜에 액세스해야합니다. 도와주세요.

답변

2

MongoDB에서 값을 마샬링/언 마샬링 할 때 값을 변경하거나 형식 변환을 수행하려면 사용자 지정 마샬링/마샬링 논리를 구현하여 값을 변환 할 수 있습니다.

bson.Getterbson.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.Getterbson.Setter을 구현했기 때문에 SetBSON()GetBSON()이 끝없이 호출됩니다. 새 my 형식에는 이러한 메서드가 없으므로 무한한 "재귀"가 발생하지 않습니다. type 키워드는 새 형식을 만들고 기본 형식의 메서드를 "상속하지"않습니다. 그래서 우리는 구현하지 않은 경우 Set default date when inserting document with time.Time field

+0

는'bson.Getter'하고'bson.Setter' 우리가 단순히'clienConfigData' 잘 반환 할 수 있습니다

또한/관련 비슷한 질문을 볼? 그러나이 경우에 우리는 더 잘하지 않습니다. 이 올바른지? –

+1

'GetBSON()'과'SetBSON()'**을 추가하는 것은 ** Getter와 Setter를 구현하는 것입니다 ('Getter'와'Setter'는'GetBSON()을 정의하는 인터페이스입니다.)'및'SetBSON()').이러한 메소드를 추가하지 않으면 리턴 할 항목이 없습니다. – icza

+0

고마워요 @icza –