」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 Mgo (Go) 在 MongoDB 中儲存具有不同節點類型的工作流程?

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

發佈於2024-11-09
瀏覽:668

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