Schnittstellentypen als Modelle in mgo (Go)
Problem:
In einem Szenario Bei Arbeitsabläufen und eingebetteten Knoten verschiedener Typen führt die Verwendung einer Schnittstelle zum Modellieren von Knoten in MongoDB mit mgo zu einem Fehler. Der Fehler tritt auf, weil mgo die eingebetteten Node-Dokumente ohne Typinformationen nicht entmarshalieren kann.
Lösung:
Um diese Einschränkung zu überwinden, sollten Sie erwägen, eine Struktur zu definieren, die beide Node-Typen enthält und die zugehörigen Typinformationen:
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string }</code>
Verwenden Sie innerhalb der Workflow-Struktur ein Array von NodeWithType-Strukturen, um die Knoten zu speichern:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
Um die Daten korrekt zu dekodieren, implementieren Sie die SetBSON-Funktion auf 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>
Dieser Ansatz ermöglicht es mgo, die eingebetteten Knoten basierend auf den in der NodeWithType-Struktur gespeicherten Typinformationen korrekt zu entmarshalieren.
Das obige ist der detaillierte Inhalt vonWie modelliere ich eingebettete Knoten verschiedener Typen in MongoDB mit mgo mithilfe von Schnittstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!