Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Memodelkan Nod Terbenam Pelbagai Jenis dalam MongoDB dengan mgo menggunakan Antara Muka?

Bagaimana untuk Memodelkan Nod Terbenam Pelbagai Jenis dalam MongoDB dengan mgo menggunakan Antara Muka?

DDD
DDDasal
2024-10-26 10:34:29835semak imbas

How to Model Embedded Nodes of Different Types in MongoDB with mgo using Interfaces?

Jenis Antara Muka sebagai Model dalam mgo (Go)

Masalah:

Dalam senario melibatkan aliran kerja dan nod terbenam pelbagai jenis, menggunakan antara muka untuk memodelkan nod dalam MongoDB dengan mgo menghasilkan ralat. Ralat berlaku kerana mgo tidak boleh menyahmarshal dokumen Nod terbenam tanpa maklumat jenis.

Penyelesaian:

Untuk mengatasi had ini, pertimbangkan untuk menentukan struct untuk memegang kedua-dua jenis Nod dan maklumat jenis yang berkaitan:

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

Dalam struct Aliran Kerja, gunakan tatasusunan struct NodeWithType untuk menyimpan nod:

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

Untuk menyahkod data dengan betul, laksanakan fungsi SetBSON pada NodeWithType:

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the type string
   typeStr := r.String()

   // Create a new Node value based on the type string
   switch typeStr {
   case "EmailNode":
      nt.Node = &EmailNode{}
   case "TwitterNode":
      nt.Node = &TwitterNode{}
   default:
      return errors.New("Unknown node type")
   }

   // Unmarshal the remaining data to the Node value
   bsonBytes, err := bson.Marshal(r.Body)
   if err != nil {
      return err
   }
   return bson.Unmarshal(bsonBytes, nt.Node)
}</code>

Pendekatan ini membolehkan mgo menyahmarshal nod terbenam dengan betul, berdasarkan maklumat jenis yang disimpan dalam struct NodeWithType.

Atas ialah kandungan terperinci Bagaimana untuk Memodelkan Nod Terbenam Pelbagai Jenis dalam MongoDB dengan mgo menggunakan Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn