내 노드 프로젝트에 몽구스가있는 문서에서 항상 virtuals properties을 사용하고 golang 프로젝트에서 동일한 메커니즘을 사용하려고합니다. 이런 식으로 구현하는 최선의 방법을 찾을 수 없습니다.bson 스키마의 Virtuals 속성
DB에서 가져온 일부 구조체가 있는데 내 서버 구성 (예 : IP 주소 등)에 따라 필드를 추가하고 싶습니다. 이 콜렉션의 문서를 가져올 때마다 동일한 함수를 호출하는 것을 피하기를 원합니다.
내 노드 프로젝트에 몽구스가있는 문서에서 항상 virtuals properties을 사용하고 golang 프로젝트에서 동일한 메커니즘을 사용하려고합니다. 이런 식으로 구현하는 최선의 방법을 찾을 수 없습니다.bson 스키마의 Virtuals 속성
DB에서 가져온 일부 구조체가 있는데 내 서버 구성 (예 : IP 주소 등)에 따라 필드를 추가하고 싶습니다. 이 콜렉션의 문서를 가져올 때마다 동일한 함수를 호출하는 것을 피하기를 원합니다.
가장 쉬운 방법은 원하는 값을 계산하는 구조체에 메서드를 추가하는 것입니다. 필요할 때 해당 메서드를 호출하면됩니다.
예를 들어이의
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:"-"`
}
감사를 절약에서이 분야를 제외 할
-
bson 태그 값을 사용할 수 있습니다, 그것은 작동하고 나에게 많은 작업을 저장합니다! – vmathieu