Heim >Backend-Entwicklung >Golang >Wie ignoriere ich Nullen beim Unmarshaling von MongoDB-Dokumenten in Go?

Wie ignoriere ich Nullen beim Unmarshaling von MongoDB-Dokumenten in Go?

DDD
DDDOriginal
2024-12-27 11:12:08361Durchsuche

How to Ignore Nulls When Unmarshaling MongoDB Documents in Go?

Nullen beim Unmarshaling von MongoDB-Dokumenten ignorieren

Mongo-Go-Driver bietet mehrere Ansätze zum Ignorieren von Nullen beim Unmarshaling von MongoDB-Dokumenten in Go-Strukturen.

1. Benutzerdefinierte Decoder für bestimmte Typen

  • Erstellen Sie benutzerdefinierte Decoder für jeden Typ, der Nullwerte verarbeiten kann.
  • Legen Sie den leeren Wert fest (z. B. „“ für Zeichenfolgen, 0 für Ganzzahlen). ) bei Null.
  • Registrieren Sie die Decoder in einer Registrierung und legen Sie sie auf dem mongo.Client oder einem anderen relevanten Gerät fest Objekte.

2. „Typneutrale“ Null-Aware-Decoder

  • Erstellen Sie einen generischen Decoder, der Nullwerte für alle Zieltypen verarbeitet.
  • Setzen Sie den decodierten Wert auf den Nullwert des Typs. Nullwerte werden effektiv ignoriert.
  • Registrieren Sie den Decoder für bestimmte Typen oder alle Typen mit a RegistryBuilder.

Codebeispiel:

// 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)

Das obige ist der detaillierte Inhalt vonWie ignoriere ich Nullen beim Unmarshaling von MongoDB-Dokumenten in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn