Maison > développement back-end > Golang > le corps du texte

Comment pouvez-vous stocker des flux de travail avec divers types de nœuds dans MongoDB à l'aide de Mgo (Go) ?

Linda Hamilton
Libérer: 2024-10-26 19:58:02
original
611 Les gens l'ont consulté

How Can You Store Workflows with Diverse Node Types in MongoDB using Mgo (Go)?

Interface en tant que modèle dans Mgo (Go) : résolution de l'erreur d'assignabilité

Lorsque vous traitez des flux de travail comprenant des nœuds de différents types, cela peut être Il est tentant d’exploiter les interfaces Golang pour encapsuler leurs divers comportements. Cependant, stocker de tels flux de travail dans MongoDB pose un défi unique.

Le problème d'assignabilité

L'erreur rencontrée lors de l'opération Rechercher provient de l'incompatibilité entre le document décodé et le Interface de nœud. Mgo ne dispose pas des informations de type nécessaires pour déterminer le type spécifique de chaque nœud intégré. Cela entraîne une incompatibilité d'affectation.

Approche alternative : intégration avec des informations de type

Pour surmonter cet obstacle, envisagez d'encapsuler les informations de type dans les nœuds intégrés. Définissez une nouvelle structure, NodeWithType, qui se compose de l'interface Node et d'un champ Type représentant le type spécifique.

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}</code>
Copier après la connexion

Unmarshaling BSON personnalisé

Pour combler le fossé entre le document décodé et la structure Go, implémentez la fonction SetBSON pour NodeWithType. Cette fonction décodera le champ Type, créera une instance du type correspondant et lui déléguera le démarshaling.

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode Type field
   var typeName string
   err := bson.Unmarshal(r["Type"], &typeName)
   if err != nil {
      return err
   }

   // Create an instance of the correct type based on Type field
   var node Node
   switch typeName {
   case "EmailNode":
      node = &EmailNode{}
   case "TwitterNode":
      node = &TwitterNode{}
   }

   // Unmarshal the remaining fields into the created instance
   if err = node.SetBSON(r[typeName]); err != nil {
      return err
   }

   // Assign the created instance to the Node field
   nt.Node = node

   return nil
}</code>
Copier après la connexion

Dans la structure Workflow, remplacez la tranche Node par une tranche de NodeWithType.

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

Grâce à cette approche, Mgo peut désormais trouver et désorganiser avec succès des flux de travail avec des nœuds intégrés de différents types.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!