首頁 > 後端開發 > Golang > 在 Go 中解組 MongoDB 文件時如何處理空值?

在 Go 中解組 MongoDB 文件時如何處理空值?

Susan Sarandon
發布: 2024-12-30 07:20:10
原創
756 人瀏覽過

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

在解組 MongoDB 文件時處理空值

在將 MongoDB 文件解組到 Go 結構的過程中忽略空值是一種常見的需求。在本文中,我們將探索在 mongo-go-driver 中使用自訂解碼器的解決方案。

自訂字串解碼器

首先,讓我們處理字串的空值。我們定義一個將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)
登入後複製

使用此設置,當解組過程中遇到空值時,指定類型的值將設定為其各自的零值。

以上是在 Go 中解組 MongoDB 文件時如何處理空值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板