Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan Nilai Null Apabila Menghapuskan Dokumen MongoDB dalam Go?

Bagaimana Mengendalikan Nilai Null Apabila Menghapuskan Dokumen MongoDB dalam Go?

Susan Sarandon
Lepaskan: 2024-12-30 07:20:10
asal
756 orang telah melayarinya

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

Mengendalikan Nilai Null Semasa Menyahmarshalling Dokumen MongoDB

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.

Penyahkod Rentetan Tersuai

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
}
Salin selepas log masuk

Menggunakan Penyahkod Tersuai

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)
Salin selepas log masuk

Dekoder Jenis-Neutral untuk Mana-mana Null Nilai

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
}
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan