Maison  >  Article  >  développement back-end  >  Comment modéliser des nœuds intégrés de différents types dans MongoDB avec mgo à l'aide d'interfaces ?

Comment modéliser des nœuds intégrés de différents types dans MongoDB avec mgo à l'aide d'interfaces ?

DDD
DDDoriginal
2024-10-26 10:34:29761parcourir

How to Model Embedded Nodes of Different Types in MongoDB with mgo using Interfaces?

Types d'interfaces comme modèles dans mgo (Go)

Problème :

Dans un scénario impliquant des workflows et des nœuds intégrés de différents types, l'utilisation d'une interface de modélisation de nœuds dans MongoDB avec mgo entraîne une erreur. L'erreur se produit car mgo ne peut pas désassembler les documents Node intégrés sans informations de type.

Solution :

Pour surmonter cette limitation, envisagez de définir une structure pour contenir à la fois le type Node et les informations de type associées :

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}</code>

Dans la structure Workflow, utilisez un tableau de structures NodeWithType pour stocker les nœuds :

<code class="go">type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}</code>

Pour décoder correctement les données, implémentez la fonction SetBSON sur NodeWithType :

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the type string
   typeStr := r.String()

   // Create a new Node value based on the type string
   switch typeStr {
   case "EmailNode":
      nt.Node = &EmailNode{}
   case "TwitterNode":
      nt.Node = &TwitterNode{}
   default:
      return errors.New("Unknown node type")
   }

   // Unmarshal the remaining data to the Node value
   bsonBytes, err := bson.Marshal(r.Body)
   if err != nil {
      return err
   }
   return bson.Unmarshal(bsonBytes, nt.Node)
}</code>

Cette approche permet à mgo de désorganiser correctement les nœuds intégrés, en fonction des informations de type stockées dans la structure NodeWithType.

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