Bagaimanakah Anda Boleh Menyimpan Aliran Kerja dengan Pelbagai Jenis Nod dalam MongoDB menggunakan Mgo (Go)?

Linda Hamilton
Lepaskan: 2024-10-26 19:58:02
asal
611 orang telah melayarinya

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

Antaramuka sebagai Model dalam Mgo (Go): Menyelesaikan Ralat Kebolehtugasan

Apabila berurusan dengan aliran kerja yang terdiri daripada nod pelbagai jenis, ia mungkin menggoda untuk memanfaatkan antara muka Golang untuk merangkum tingkah laku mereka yang pelbagai. Walau bagaimanapun, menyimpan aliran kerja sedemikian dalam MongoDB menimbulkan cabaran yang unik.

Isu Kebolehtugasan

Ralat yang dihadapi semasa operasi Cari berpunca daripada ketidakserasian antara dokumen yang dinyahkodkan dan Antara muka nod. Mgo kekurangan maklumat jenis yang diperlukan untuk menentukan jenis khusus setiap nod terbenam. Ini mengakibatkan ketidakpadanan tugasan.

Pendekatan Alternatif: Membenamkan dengan Maklumat Jenis

Untuk mengatasi halangan ini, pertimbangkan untuk merangkum maklumat jenis dalam nod terbenam. Tentukan struct baharu, NodeWithType, yang terdiri daripada antara muka Nod dan medan Jenis yang mewakili jenis tertentu.

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

Custom BSON Unmarshaling

Untuk merapatkan jurang antara dokumen yang dinyahkod dan struct Go, laksanakan fungsi SetBSON untuk NodeWithType. Fungsi ini akan menyahkod medan Jenis, mencipta contoh jenis yang sepadan dan mewakilkan unmarshaling kepadanya.

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

Dalam struct Aliran Kerja, gantikan kepingan Nod dengan kepingan NodeWithType.

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

Dengan pendekatan ini, Mgo kini boleh berjaya mencari dan membongkar aliran kerja dengan nod terbenam pelbagai jenis.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Menyimpan Aliran Kerja dengan Pelbagai Jenis Nod dalam MongoDB menggunakan Mgo (Go)?. 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
Artikel terbaru oleh pengarang
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!