Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie mit Mgo (Go) Workflows mit verschiedenen Knotentypen in MongoDB speichern?

Wie können Sie mit Mgo (Go) Workflows mit verschiedenen Knotentypen in MongoDB speichern?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 19:58:02615Durchsuche

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

Schnittstelle als Modell in Mgo (Go): Behebung des Zuweisbarkeitsfehlers

Beim Umgang mit Workflows, die Knoten unterschiedlichen Typs umfassen, kann dies der Fall sein Es ist verlockend, Golang-Schnittstellen zu nutzen, um ihre unterschiedlichen Verhaltensweisen zu kapseln. Das Speichern solcher Workflows in MongoDB stellt jedoch eine einzigartige Herausforderung dar.

Das Problem der Zuordenbarkeit

Der beim Suchvorgang aufgetretene Fehler ist auf die Inkompatibilität zwischen dem dekodierten Dokument und dem Dokument zurückzuführen Knotenschnittstelle. Mgo fehlen die Typinformationen, die erforderlich sind, um den spezifischen Typ jedes eingebetteten Knotens zu bestimmen. Dies führt zu einer Zuordnungsinkongruenz.

Alternativer Ansatz: Einbetten mit Typinformationen

Um diese Hürde zu überwinden, sollten Sie erwägen, die Typinformationen innerhalb der eingebetteten Knoten zu kapseln. Definieren Sie eine neue Struktur, NodeWithType, die aus der Node-Schnittstelle und einem Typfeld besteht, das den spezifischen Typ darstellt.

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

Benutzerdefiniertes BSON-Unmarshaling

Um die Lücke zu schließen Implementieren Sie zwischen dem dekodierten Dokument und der Go-Struktur die SetBSON-Funktion für NodeWithType. Diese Funktion dekodiert das Type-Feld, erstellt eine Instanz des entsprechenden Typs und delegiert das Unmarshaling an ihn.

<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>

Ersetzen Sie in der Workflow-Struktur das Node-Slice durch ein NodeWithType-Slice.

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

Mit diesem Ansatz kann Mgo nun erfolgreich Workflows mit eingebetteten Knoten unterschiedlichen Typs finden und entmarshalieren.

Das obige ist der detaillierte Inhalt vonWie können Sie mit Mgo (Go) Workflows mit verschiedenen Knotentypen in MongoDB speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn