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

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

Susan Sarandon
풀어 주다: 2024-12-30 07:20:10
원래의
756명이 탐색했습니다.

How to Handle Null Values When Unmarshalling MongoDB Documents in Go?

MongoDB 문서를 언마샬링하는 동안 Null 값 처리

MongoDB 문서를 Go 구조체로 언마샬링하는 과정에서 Null 값을 무시하는 것은 일반적으로 필요합니다. 이 기사에서는 mongo-go-driver의 사용자 정의 디코더를 사용하는 솔루션을 살펴보겠습니다.

사용자 정의 문자열 디코더

먼저 문자열의 null 값을 처리해 보겠습니다. null 값을 빈 문자열로 해석하는 사용자 정의 디코더를 정의합니다.

import (
    "go.mongodb.org/mongo-driver/bson/bsoncodec"
    "go.mongodb.org/mongo-driver/bson/bsonrw"
)

type nullawareStrDecoder struct{}

func (nullawareStrDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if !val.CanSet() || val.Kind() != reflect.String {
        return errors.New("bad type or not settable")
    }
    var str string
    switch vr.Type() {
    case bsontype.String:
        str, _ = vr.ReadString()
    case bsontype.Null:
        _ = vr.ReadNull()
    default:
        return fmt.Errorf("cannot decode %v into a string type", vr.Type())
    }

    val.SetString(str)
    return nil
}
로그인 후 복사

사용자 정의 디코더 활용

특정 클라이언트에 대해 이 사용자 정의 디코더를 사용하려면 클라이언트의 레지스트리에 등록합니다.

clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(
        bson.NewRegistryBuilder().
            RegisterDecoder(reflect.TypeOf(""), nullawareStrDecoder{}).
            Build(),
    )
client, err := mongo.Connect(ctx, clientOpts)
로그인 후 복사

모든 Null에 대한 유형 중립 디코더 값

보다 포괄적인 접근 방식은 모든 유형의 null 값을 처리하는 유형 중립 디코더를 만드는 것입니다.

import (
    "go.mongodb.org/mongo-driver/bson/bsoncodec"
    "go.mongodb.org/mongo-driver/bson/bsonrw"
    "reflect"
)

type nullawareDecoder struct {
    defDecoder bsoncodec.ValueDecoder
    zeroValue  reflect.Value
}

func (d *nullawareDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if vr.Type() != bsontype.Null {
        return d.defDecoder.DecodeValue(dctx, vr, val)
    }

    if !val.CanSet() {
        return errors.New("value not settable")
    }
    _ = vr.ReadNull()
    val.Set(d.zeroValue)
    return nil
}
로그인 후 복사

null을 무시하려는 각 유형에 대해 다음을 사용할 수 있습니다. 디코더. 예를 들어 문자열과 정수의 경우:

customValues := []interface{}{
    "",       // string
    int(0),   // int
}

rb := bson.NewRegistryBuilder()
for _, v := range customValues {
    t := reflect.TypeOf(v)
    defDecoder, err := bson.DefaultRegistry.LookupDecoder(t)
    if err != nil {
        panic(err)
    }
    rb.RegisterDecoder(t, &nullawareDecoder{defDecoder, reflect.Zero(t)})
}

clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(rb.Build())
client, err := mongo.Connect(ctx, clientOpts)
로그인 후 복사

이 설정을 사용하면 비정렬화 중에 null이 발견되면 지정된 유형의 값이 해당 0 값으로 설정됩니다.

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

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