„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 09.11.2024
Durchsuche:810

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

Schnittstelle als Modell in Mgo (Go): Beheben 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 Arbeitsabläufe in MongoDB stellt jedoch eine einzigartige Herausforderung dar.

Das Problem der Zuweisung

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.

type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

Benutzerdefiniertes BSON-Unmarshaling

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

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
}

Ersetzen Sie in der Workflow-Struktur den Node-Slice durch einen Slice von NodeWithType.

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}

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

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3