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

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

Susan Sarandon
풀어 주다: 2025-01-02 16:23:07
원래의
855명이 탐색했습니다.

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

MongoDB 문서 언마샬링 중 Null 값 무시

MongoDB 문서를 Null을 허용하지 않는 문자열 필드가 포함된 Go 구조체로 언마샬링할 때 null이 발생함 문서의 값에 오류가 발생할 수 있습니다. 이 문제를 해결하려면 언마샬링 중에 이러한 null 값을 무시하는 방법을 찾아야 합니다.

사용자 정의 디코더 사용

null 값을 처리하는 한 가지 접근 방식은 다음과 같습니다. 문자열 유형에 대한 사용자 정의 디코더를 생성합니다. 이 사용자 정의 디코더는 null 값을 인식하고 해당 필드를 빈 문자열로 설정하여 이를 처리하며 null 값을 효과적으로 무시합니다.

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

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
    var err error
    switch vr.Type() {
    case bsontype.String:
        if str, err = vr.ReadString(); err != nil {
            return err
        }
    case bsontype.Null:
        if err = vr.ReadNull(); err != nil {
            return err
        }
    default:
        return fmt.Errorf("cannot decode %v into a string type", vr.Type())
    }

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

그런 다음 이 사용자 정의 디코더를 bsoncodec.Registry에 등록하고 다음에 적용할 수 있습니다. mongo.Client 객체:

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

유형 중립 Null 인식 생성 디코더

여러 유형의 null 값을 처리하기 위해 null 값을 확인하고, 발견되면 해당 필드를 해당 필드의 0 값으로 설정하는 단일 유형 중립 디코더를 생성할 수 있습니다. 유형:

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")
    }
    if err := vr.ReadNull(); err != nil {
        return err
    }

    val.Set(d.zeroValue)
    return nil
}
로그인 후 복사

이 디코더는 특정 유형 또는 모든 유형에 대해 bsoncodec.Registry에 등록할 수 있습니다. 유형:

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

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)})
}
로그인 후 복사

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

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