”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 Mgo (Go) 在 MongoDB 中存储具有不同节点类型的工作流?

如何使用 Mgo (Go) 在 MongoDB 中存储具有不同节点类型的工作流?

发布于2024-11-09
浏览:763

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

Mgo(Go)中的接口作为模型:解决可分配性错误

当处理包含不同类型节点的工作流时,可能会人们倾向于利用 Golang 接口来封装其不同的行为。然而,在 MongoDB 中存储这样的工作流程带来了独特的挑战。

可分配性问题

查找操作期间遇到的错误源于解码文档与解码文档之间的不兼容。节点接口。 Mgo 缺乏确定每个嵌入节点的特定类型所需的类型信息。这会导致分配不匹配。

替代方法:嵌入类型信息

要克服此障碍,请考虑将类型信息封装在嵌入节点中。定义一个新的结构体 NodeWithType,它由 Node 接口和表示特定类型的 Type 字段组成。

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

自定义 BSON 解组

要弥合解码文档和 Go 结构之间的差距,请为 NodeWithType 实现 SetBSON 函数。该函数将解码 Type 字段,创建相应类型的实例,并将解组委托给它。

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
}

在 Workflow 结构中,将 Node 切片替换为 NodeWithType 的切片。

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

通过这种方法,Mgo 现在可以成功查找和解组具有不同类型的嵌入式节点的工作流程。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3