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!