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
Libérer: 2024-12-27 11:12:08
original
404 Les gens l'ont consulté

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)
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal