"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 pouvez-vous stocker des flux de travail avec divers types de nœuds dans MongoDB à l'aide de Mgo (Go) ?

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

Publié le 2024-11-09
Parcourir:870

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, le stockage 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 de recherche 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, composée de l'interface Node et d'un champ Type représentant le type spécifique.

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

Démarshaling BSON personnalisé

Pour combler l'écart 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.

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
}

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

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

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.

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