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

在 Go 中解組 MongoDB 文件時如何忽略空值?

DDD
DDD原創
2024-12-27 11:12:08359瀏覽

How to Ignore Nulls When Unmarshaling MongoDB Documents in Go?

在MongoDB 文件解組期間忽略空值

Mongo-Go-Driver 提供了幾個在將MongoDB 文檔解組到Go結構時忽略空值的方法。

1。特定類型的自訂解碼器

  • 為每種可以處理空值的類型建立自訂解碼器。
  • 設定空值(例如,「」表示字串,0表示整數) 遇到 null 時。
  • 在登錄中註冊解碼器並將其設定在 mongo.Client 或其他相關的物件。

2。 「型別」空感知解碼器

  • 建立一個處理所有目標類型的空值的通用解碼器。
  • 將解碼值設定為類型的零值,有效地忽略空值。
  • 使用 a 註冊特定類型或所有類型的解碼器RegistryBuilder。

程式碼範例:

// Nullaware decoder for all types, setting null values to zero values
type NullawareDecoder struct {
    DefDecoder bsoncodec.ValueDecoder
    ZeroValue  reflect.Value
}

// Decodes null values to zero values, otherwise delegates to the default decoder
func (nd *NullawareDecoder) DecodeValue(dctx bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
    if vr.Type() == bsontype.Null {
        if !val.CanSet() {
            return errors.New("value not settable")
        }
        if err := vr.ReadNull(); err != nil {
            return err
        }
        val.Set(nd.ZeroValue)
        return nil
    }
    return nd.DefDecoder.DecodeValue(dctx, vr, val)
}

// Register NullawareDecoder for desired types
rb := bson.NewRegistryBuilder()
rb.RegisterDecoder(reflect.TypeOf(""), &NullawareDecoder{bson.DefaultRegistry.LookupDecoder(reflect.TypeOf("")), reflect.ValueOf("")})
// ... (register for other types as needed)

// Use the registry within a ClientOptions instance
clientOpts := options.Client().
    ApplyURI("mongodb://localhost:27017/").
    SetRegistry(rb.Build())

// Initialize MongoDB client with customized registry to ignore nulls
client, err := mongo.Connect(ctx, clientOpts)

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn