Maison >développement back-end >Golang >Comment ignorer les valeurs nulles lors de la désorganisation de documents MongoDB dans Go ?

Comment ignorer les valeurs nulles lors de la désorganisation de documents MongoDB dans Go ?

DDD
DDDoriginal
2024-12-27 11:12:08361parcourir

How to Ignore Nulls When Unmarshaling MongoDB Documents in Go?

Ignorer les valeurs nulles lors de la désorganisation des documents MongoDB

Mongo-Go-Driver propose plusieurs approches pour ignorer les valeurs nulles lors de la désorganisation des documents MongoDB dans les structures Go.

1. Décodeurs personnalisés pour des types spécifiques

  • Créez des décodeurs personnalisés pour chaque type pouvant gérer des valeurs nulles.
  • Définissez la valeur vide (par exemple, "" pour les chaînes, 0 pour les entiers ) lorsque vous rencontrez null.
  • Enregistrez les décodeurs dans un registre et définissez-le sur le mongo.Client ou autre objets pertinents.

2. Décodeurs nuls « de type neutre »

  • Créez un décodeur générique qui gère les valeurs nulles pour tous les types cibles.
  • Définissez la valeur décodée sur la valeur zéro du type, ignorant efficacement les valeurs nulles.
  • Enregistrez le décodeur pour des types spécifiques ou tous les types à l'aide d'un RegistryBuilder.

Exemple de code :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn