"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 posso lidar com tipos de interface em documentos incorporados ao usar mgo para desempacotar dados do MongoDB?

Como posso lidar com tipos de interface em documentos incorporados ao usar mgo para desempacotar dados do MongoDB?

Publicado em 2024-11-11
Navegar:879

How Can I Handle Interface Types in Embedded Documents When Using mgo to Unmarshal MongoDB Data?

Compreendendo os tipos de interface em modelos mgo

No contexto do MongoDB e Go, modelar dados com interfaces pode apresentar desafios devido à natureza dinâmica de interfaces. Aqui está uma explicação concisa do problema que você encontrou e uma solução sugerida.

O problema com tipos de interface

O modelo de dados baseado em documento do MongoDB não fornece tipo informações para documentos incorporados. Ao usar mgo para desempacotar documentos MongoDB contendo tipos de interface em estruturas Go, mgo não pode determinar o tipo específico de cada documento incorporado. Isso resulta no erro "o valor do tipo bson.M não pode ser atribuído ao tipo Node." é agrupar o tipo de interface em uma estrutura personalizada que fornece informações de tipo. Isso permite que mgo identifique o tipo específico do documento incorporado durante a desempacotamento.

Considere o seguinte exemplo:

type NodeWithType struct { Nó Nó `bson:"-"` Digite string } tipo estrutura de fluxo de trabalho { CriadoNa hora.Time StartedAt time.Time Criado por string Nós []NodeWithType }

Implementando a função SetBSON

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

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

func (nt *NodeWithType) SetBSON(r bson.Raw) error { //Decodifica o campo "Tipo" e determina o tipo de nó var typeStr string se errar := r.Unmarshal(&typeStr); err! = nulo { retornar errar } // Cria uma nova instância do tipo Node com base na string do tipo nó, ok:= reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node) se !ok { retornar erros.New("tipo de nó inválido") } // Descompacta os dados restantes na instância do Node se errar := r.Unmarshal(nó); err! = nulo { retornar errar } // Atribui a instância do Node à estrutura NodeWithType nt.Node = nó retorno nulo }

Conclusão

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the "Type" field and determine the Node type
   var typeStr string
   if err := r.Unmarshal(&typeStr); err != nil {
      return err
   }

   // Create a new instance of the Node type based on the type string
   node, ok := reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node)
   if !ok {
      return errors.New("invalid Node type")
   }

   // Unmarshal the remaining data into the Node instance
   if err := r.Unmarshal(node); err != nil {
      return err
   }

   // Assign the Node instance to the NodeWithType struct
   nt.Node = node
   return nil
}
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