"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como você pode armazenar fluxos de trabalho com diversos tipos de nós no MongoDB usando Mgo (Go)?

Como você pode armazenar fluxos de trabalho com diversos tipos de nós no MongoDB usando Mgo (Go)?

Publicado em 2024-11-09
Navegar:599

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

Interface como modelo em Mgo (Go): Resolvendo o erro de atribuição

Ao lidar com fluxos de trabalho compreendendo nós de tipos variados, pode ser tentador aproveitar as interfaces Golang para encapsular seus diversos comportamentos. No entanto, armazenar esses fluxos de trabalho no MongoDB representa um desafio único.

O problema de atribuição

O erro encontrado durante a operação Find decorre da incompatibilidade entre o documento decodificado e o Interface do nó. O Mgo não possui as informações de tipo necessárias para determinar o tipo específico de cada nó incorporado. Isso resulta em uma incompatibilidade de atribuição.

Abordagem alternativa: incorporação com informações de tipo

Para superar esse obstáculo, considere encapsular as informações de tipo nos nós incorporados. Defina uma nova estrutura, NodeWithType, que consiste na interface Node e um campo Type representando o tipo específico.

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

Desempacotamento BSON personalizado

Para preencher a lacuna entre o documento decodificado e a estrutura Go, implemente a função SetBSON para NodeWithType. Esta função irá decodificar o campo Type, criar uma instância do tipo correspondente e delegar a desempacotamento a ele.

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
}

Na estrutura de fluxo de trabalho, substitua a fatia Node por uma fatia de NodeWithType.

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

Com essa abordagem, Mgo agora pode encontrar e desempacotar fluxos de trabalho com nós incorporados de diferentes tipos.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3