Mengabaikan nilai null semasa proses unmarshalling dokumen MongoDB ke dalam struct Go adalah keperluan biasa. Dalam artikel ini, kami akan meneroka penyelesaian menggunakan penyahkod tersuai dalam pemandu mongo-go.
Pada mulanya, mari kita kendalikan nilai nol untuk rentetan. Kami mentakrifkan penyahkod tersuai yang mentafsir nilai nol sebagai rentetan kosong:
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 }
Untuk menggunakan penyahkod tersuai ini untuk pelanggan tertentu, kami mendaftarkannya dengan pendaftaran pelanggan:
clientOpts := options.Client(). ApplyURI("mongodb://localhost:27017/"). SetRegistry( bson.NewRegistryBuilder(). RegisterDecoder(reflect.TypeOf(""), nullawareStrDecoder{}). Build(), ) client, err := mongo.Connect(ctx, clientOpts)
Pendekatan yang lebih komprehensif melibatkan penciptaan penyahkod neutral jenis yang mengendalikan nilai nol untuk sebarang jenis:
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 }
Untuk setiap jenis yang kami mahu null diabaikan, kami boleh menggunakan ini penyahkod. Contohnya, untuk rentetan dan integer:
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)
Dengan persediaan ini, nilai untuk jenis yang ditentukan akan ditetapkan kepada nilai sifar masing-masing apabila null ditemui semasa unmarshalling.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Nilai Null Apabila Menghapuskan Dokumen MongoDB dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!