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 값을 처리하는 유형 중립 디코더를 만드는 것입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!