MongoDB ドキュメントのアンマーシャリング中の Null 値の無視
MongoDB ドキュメントを Null 非許容文字列フィールドを含む Go 構造体にアンマーシャリングすると、null が発生しますドキュメント内の値によってはエラーが発生する可能性があります。この問題に対処するには、アンマーシャリング中にこれらの null 値を無視する方法を見つける必要があります。
カスタム デコーダの使用
null 値を処理する 1 つのアプローチは、次のとおりです。文字列型のカスタム デコーダを作成します。このカスタム デコーダは 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 認識の作成Decoder
複数の型の null 値を処理するには、null 値をチェックし、見つかった場合は対応するフィールドをその値の 0 に設定する単一の型に依存しないデコーダーを作成できます。 type:
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 中国語 Web サイトの他の関連記事を参照してください。