2017-12-18 20 views
1

내 노드 프로젝트에 몽구스가있는 문서에서 항상 virtuals properties을 사용하고 golang 프로젝트에서 동일한 메커니즘을 사용하려고합니다. 이런 식으로 구현하는 최선의 방법을 찾을 수 없습니다.bson 스키마의 Virtuals 속성

DB에서 가져온 일부 구조체가 있는데 내 서버 구성 (예 : IP 주소 등)에 따라 필드를 추가하고 싶습니다. 이 콜렉션의 문서를 가져올 때마다 동일한 함수를 호출하는 것을 피하기를 원합니다.

답변

1

가장 쉬운 방법은 원하는 값을 계산하는 구조체에 메서드를 추가하는 것입니다. 필요할 때 해당 메서드를 호출하면됩니다.

예를 들어

이의

type Person struct { 
    FirstName string `bson:"firstName"` 
    LastName string `bson:"lastName"` 
} 

func (p *Person) Name() string { 
    return p.FirstName + " " + p.LastName 
} 

func main() { 
    p := &Person{FirstName: "Bob", LastName: "Archer"} 
    fmt.Println(p.Name()) 
} 

장점 Name() 항상 문서를 검색 한 후 첫 번째 또는 마지막 이름을 수정할 경우에도 "올바른"이름을 반환하는 것입니다.

항상 결과를 계산하는 것을 피하기하려면, 필드에 저장할 수있는 예 : Person의 값을 저장하면, name 필드로 지속되지 것

type Person struct { 
    FirstName string `bson:"firstName"` 
    LastName string `bson:"lastName"` 
    name  string 
} 

func (p *Person) Name() string { 
    if p.name == "" { 
     p.name = p.FirstName + " " + p.LastName 
    } 
    return p.name 
} 

그것은 수출되지 않습니다.

name을 MongoDB에서 가져올 때 자동으로 계산하려면 bson.Setter 인터페이스를 구현하여 맞춤식 마샬링 로직을 작성할 수 있습니다. 사용자 지정 마샬링 논리는 특별한 것이 아니며 기본 마샬링 논리를 수행 한 후 name 필드를 계산하고 설정하면됩니다. 예를 들어

: 당신이 원하는 경우

type Person struct { 
    FirstName string `bson:"firstName"` 
    LastName string `bson:"lastName"` 
    name  string 
} 

func (p *Person) SetBSON(raw bson.Raw) (err error) { 
    type my Person 
    if err = raw.Unmarshal((*my)(p)); err != nil { 
     return 
    } 
    p.name = p.FirstName + " " + p.LastName 
    return nil 
} 

을 그리고 name 필드를 내보낼 수, 예를 들어, Name이, 당신이 들어 MongoDB를에 예컨대 :

type Person struct { 
    FirstName string `bson:"firstName"` 
    LastName string `bson:"lastName"` 
    Name  string `bson:"-"` 
} 
+0

감사를 절약에서이 분야를 제외 할 - bson 태그 값을 사용할 수 있습니다, 그것은 작동하고 나에게 많은 작업을 저장합니다! – vmathieu