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

DDD
Lepaskan: 2024-10-26 10:34:29
asal
769 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!