"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je gérer les types d'interface dans les documents intégrés lors de l'utilisation de mgo pour désassembler les données MongoDB ?

Comment puis-je gérer les types d'interface dans les documents intégrés lors de l'utilisation de mgo pour désassembler les données MongoDB ?

Publié le 2024-11-11
Parcourir:369

How Can I Handle Interface Types in Embedded Documents When Using mgo to Unmarshal MongoDB Data?

Comprendre les types d'interfaces dans les modèles mgo

Dans le contexte de MongoDB et Go, la modélisation des données avec des interfaces peut présenter des défis en raison de la nature dynamique d'interfaces. Voici une explication concise du problème que vous avez rencontré et une suggestion de solution.

Le problème avec les types d'interface

Le modèle de données basé sur les documents de MongoDB ne fournit pas de type informations pour les documents intégrés. Lors de l'utilisation de mgo pour désorganiser des documents MongoDB contenant des types d'interface dans des structures Go, mgo ne peut pas déterminer le type spécifique de chaque document incorporé. Cela entraîne l'erreur « la valeur de type bson.M n'est pas attribuable au type Node. »

Solution : encapsuler les types d'interface

Pour résoudre cette limitation, une approche consiste à envelopper le type d'interface dans une structure personnalisée qui fournit des informations de type. Cela permet à mgo d'identifier le type spécifique du document incorporé lors de la désorganisation.

Considérez l'exemple suivant :

type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}

Implémentation de la fonction SetBSON

Pour compléter cette solution, vous devez implémenter la fonction SetBSON pour le type NodeWithType. Cette fonction décodera la chaîne de type, créera une instance du type correspondant et la désorganisera.

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the "Type" field and determine the Node type
   var typeStr string
   if err := r.Unmarshal(&typeStr); err != nil {
      return err
   }

   // Create a new instance of the Node type based on the type string
   node, ok := reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node)
   if !ok {
      return errors.New("invalid Node type")
   }

   // Unmarshal the remaining data into the Node instance
   if err := r.Unmarshal(node); err != nil {
      return err
   }

   // Assign the Node instance to the NodeWithType struct
   nt.Node = node
   return nil
}

Conclusion

L'utilisation de ce modèle vous permet d'utiliser efficacement les interfaces tout en conservant la possibilité de désassembler des documents incorporés de différents types. En fournissant des informations de type explicites, mgo peut décoder de manière transparente ces documents dans les structures Go souhaitées.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3