首頁  >  文章  >  後端開發  >  如何使用 Mgo (Go) 在 MongoDB 中儲存具有不同節點類型的工作流程?

如何使用 Mgo (Go) 在 MongoDB 中儲存具有不同節點類型的工作流程?

Linda Hamilton
Linda Hamilton原創
2024-10-26 19:58:02611瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn