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 중국어 웹사이트의 기타 관련 기사를 참조하세요!