Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie Go-Schnittstellen mit mgo in MongoDB-Modelle einbetten?

Wie können Sie Go-Schnittstellen mit mgo in MongoDB-Modelle einbetten?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 03:12:27926Durchsuche

 How Can You Embed Go Interfaces in MongoDB Models Using mgo?

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!

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