"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo se pueden almacenar flujos de trabajo con diversos tipos de nodos en MongoDB usando Mgo (Go)?

¿Cómo se pueden almacenar flujos de trabajo con diversos tipos de nodos en MongoDB usando Mgo (Go)?

Publicado el 2024-11-09
Navegar:114

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

Interfaz como modelo en Mgo (Go): resolución del error de asignabilidad

Cuando se trata de flujos de trabajo que comprenden nodos de distintos tipos, puede ser Es tentador aprovechar las interfaces de Golang para encapsular sus diversos comportamientos. Sin embargo, almacenar dichos flujos de trabajo en MongoDB plantea un desafío único.

El problema de asignabilidad

El error encontrado durante la operación Buscar se debe a la incompatibilidad entre el documento decodificado y el Interfaz de nodo. Mgo carece de la información de tipo necesaria para determinar el tipo específico de cada nodo integrado. Esto da como resultado una discrepancia en la asignación.

Enfoque alternativo: incrustar con información de tipo

Para superar este obstáculo, considere encapsular la información de tipo dentro de los nodos incrustados. Defina una nueva estructura, NodeWithType, que consta de la interfaz Node y un campo Tipo que representa el tipo específico.

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

Desclasificación BSON personalizada

Para cerrar la brecha entre el documento decodificado y la estructura Go, implemente la función SetBSON para NodeWithType. Esta función decodificará el campo Tipo, creará una instancia del tipo correspondiente y le delegará la desclasificación.

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
}

En la estructura de flujo de trabajo, reemplace la porción de Nodo con una porción de NodeWithType.

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

Con este enfoque, Mgo ahora puede encontrar y desorganizar con éxito flujos de trabajo con nodos integrados de diferentes tipos.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3