Einbetten von Schnittstellen in MongoDB-Modelle mit mgo
Bei der Arbeit mit einem Workflow-System, das Knoten unterschiedlichen Typs umfasst, werden häufig Go-Schnittstellen verwendet um die verschiedenen Knotentypen darzustellen. Dieser Ansatz stellt jedoch eine Herausforderung dar, wenn diese Workflows in MongoDB mit mgo gespeichert werden.
Betrachten Sie das folgende Beispiel:
<code class="go">type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []Node } type Node interface { Exec() (int, error) }</code>
Wobei Node eine Schnittstelle mit einer einzelnen Methode ist, Exec() das kann durch verschiedene Knotentypen implementiert werden.
Um einen Workflow in MongoDB zu speichern, können Sie versuchen, ihn anhand der ID zu finden:
<code class="go">w = &Workflow{} collection.FindID(bson.ObjectIdHex(id)).One(w)</code>
Es wird jedoch ein Fehler auftreten, da mgo das Unmarshalieren nicht durchführen kann Der eingebettete Knoten ist direkt in eine Go-Struktur integriert. Dies liegt daran, dass die erforderlichen Typinformationen fehlen, um für jeden Knoten den entsprechenden konkreten Typ zu erstellen.
Um dieses Problem zu beheben, können Sie eine Struktur definieren, die explizit sowohl den Knotentyp als auch den tatsächlichen Knotenwert enthält:
<code class="go">type NodeWithType struct { Node Node `bson:"-"` Type string } type Workflow struct { CreatedAt time.Time StartedAt time.Time CreatedBy string Nodes []NodeWithType }</code>
Durch die Verwendung von bson:"-" wird das Node-Unterfeld von der automatischen Dekodierung ausgeschlossen und stattdessen manuell in der SetBSON-Funktion behandelt:
<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error { // Decode the node type from the "Type" field // Create a new instance of the concrete node type based on the decoded type // Unmarshal the remaining document into the concrete node type //... }</code>
Dieser Ansatz ermöglicht es mgo, den Typ von zu identifizieren jeden Knoten und erstellen Sie während der Dekodierung die entsprechende konkrete Instanz, wodurch das Problem mit den Typinformationen gelöst wird.
Das obige ist der detaillierte Inhalt vonWie können Sie Go-Schnittstellen mit mgo in MongoDB-Modelle einbetten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!