首页 > 后端开发 > Golang > 正文

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

Linda Hamilton
发布: 2024-10-26 19:58:02
原创
611 人浏览过

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

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

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

可分配性问题

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

替代方法:嵌入类型信息

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

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}</code>
登录后复制

自定义 BSON 解组

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

<code class="go">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
}</code>
登录后复制

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

<code class="go">type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}</code>
登录后复制

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

以上是如何使用 Mgo (Go) 在 MongoDB 中存储具有不同节点类型的工作流?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!