„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 kann ich mit Schnittstellentypen in eingebetteten Dokumenten umgehen, wenn ich mgo zum Unmarshalieren von MongoDB-Daten verwende?

Wie kann ich mit Schnittstellentypen in eingebetteten Dokumenten umgehen, wenn ich mgo zum Unmarshalieren von MongoDB-Daten verwende?

Veröffentlicht am 11.11.2024
Durchsuche:609

How Can I Handle Interface Types in Embedded Documents When Using mgo to Unmarshal MongoDB Data?

Schnittstellentypen in MGO-Modellen verstehen

Im Kontext von MongoDB und Go kann die Modellierung von Daten mit Schnittstellen aufgrund der dynamischen Natur eine Herausforderung darstellen von Schnittstellen. Hier finden Sie eine kurze Erklärung des aufgetretenen Problems und einen Lösungsvorschlag.

Das Problem mit Schnittstellentypen

Das dokumentbasierte Datenmodell von MongoDB stellt keinen Typ bereit Informationen zu eingebetteten Dokumenten. Wenn Sie mgo verwenden, um MongoDB-Dokumente, die Schnittstellentypen enthalten, in Go-Strukturen zu entmarshalieren, kann mgo den spezifischen Typ jedes eingebetteten Dokuments nicht ermitteln. Dies führt zu dem Fehler „Wert vom Typ bson.M kann dem Typ Node nicht zugewiesen werden.“

Lösung: Schnittstellentypen umschließen

Um diese Einschränkung zu beheben, gibt es einen Ansatz besteht darin, den Schnittstellentyp in eine benutzerdefinierte Struktur zu packen, die Typinformationen bereitstellt. Dadurch kann MGO den spezifischen Typ des eingebetteten Dokuments beim Unmarshalling identifizieren.

Betrachten Sie das folgende Beispiel:

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

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

SetBSON-Funktion implementieren

Um diese Lösung abzuschließen, müssen Sie die SetBSON-Funktion für den NodeWithType-Typ implementieren. Diese Funktion dekodiert die Typzeichenfolge, erstellt eine Instanz des entsprechenden Typs und entmarshaliert sie.

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the "Type" field and determine the Node type
   var typeStr string
   if err := r.Unmarshal(&typeStr); err != nil {
      return err
   }

   // Create a new instance of the Node type based on the type string
   node, ok := reflect.New(reflect.TypeOf(Node).Elem()).Interface().(Node)
   if !ok {
      return errors.New("invalid Node type")
   }

   // Unmarshal the remaining data into the Node instance
   if err := r.Unmarshal(node); err != nil {
      return err
   }

   // Assign the Node instance to the NodeWithType struct
   nt.Node = node
   return nil
}

Fazit

Durch die Verwendung dieses Musters können Sie Schnittstellen effektiv nutzen und gleichzeitig die Fähigkeit zum Unmarshalieren eingebetteter Dokumente verschiedener Typen beibehalten. Durch die Bereitstellung expliziter Typinformationen kann mgo diese Dokumente nahtlos in die gewünschten Go-Strukturen dekodieren.

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