> 백엔드 개발 > Golang > Go에서 MongoDB 문서를 언마샬링할 때 Null을 무시하는 방법은 무엇입니까?

Go에서 MongoDB 문서를 언마샬링할 때 Null을 무시하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-27 11:12:08
원래의
368명이 탐색했습니다.

How to Ignore Nulls When Unmarshaling MongoDB Documents in Go?

MongoDB 문서 언마샬링 중 Null 무시

Mongo-Go-Driver는 MongoDB 문서를 Go 구조체로 언마샬링할 때 Null을 무시하는 여러 가지 접근 방식을 제공합니다.

1. 특정 유형에 대한 사용자 정의 디코더

  • Null 값을 처리할 수 있는 각 유형에 대한 사용자 정의 디코더를 생성합니다.
  • 빈 값을 설정합니다(예: 문자열의 경우 "", 정수의 경우 0). ) null이 발생하는 경우.
  • 디코더를 레지스트리에 등록하고 mongo.Client 또는 기타에 설정합니다. 관련 개체

2. "유형 중립" Null 인식 디코더

  • 모든 대상 유형에 대해 Null 값을 처리하는 일반 디코더를 만듭니다.
  • 디코딩된 값을 유형의 0 값으로 설정합니다. null 값을 효과적으로 무시합니다.
  • 특정 유형 또는 모든 유형에 대한 디코더를 등록하려면 RegistryBuilder.

코드 샘플:

// Nullaware decoder for all types, setting null values to zero values
type NullawareDecoder struct {
    DefDecoder bsoncodec.ValueDecoder
    ZeroValue  reflect.Value
}

// Decodes null values to zero values, otherwise delegates to the default decoder
func (nd *NullawareDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if vr.Type() == bsontype.Null {
        if !val.CanSet() {
            return errors.New("value not settable")
        }
        if err := vr.ReadNull(); err != nil {
            return err
        }
        val.Set(nd.ZeroValue)
        return nil
    }
    return nd.DefDecoder.DecodeValue(dctx, vr, val)
}

// Register NullawareDecoder for desired types
rb := bson.NewRegistryBuilder()
rb.RegisterDecoder(reflect.TypeOf(""), &NullawareDecoder{bson.DefaultRegistry.LookupDecoder(reflect.TypeOf("")), reflect.ValueOf("")})
// ... (register for other types as needed)

// Use the registry within a ClientOptions instance
clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(rb.Build())

// Initialize MongoDB client with customized registry to ignore nulls
client, err := mongo.Connect(ctx, clientOpts)
로그인 후 복사

위 내용은 Go에서 MongoDB 문서를 언마샬링할 때 Null을 무시하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿