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
Susan Sarandonasal
2024-12-30 07:20:10789semak imbas

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
}

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)

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
}

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!

Kenyataan:
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