Je pense qu'il est évident qu'une interface ne peut pas être instanciée, donc l'exécution bson
ne sait pas quel struct
doit être utilisé pour Unmarshal
cet objet. De plus, le type customInterface
doit être exporté (c'est-à-dire avec la lettre majuscule «C»), sinon il ne sera pas accessible depuis le runtime bson
.
Je suppose que l'utilisation d'une interface implique que le tableau NestedDocuments peut contenir des types différents, tous implémentant customInterface
.
Si tel est le cas, je crains que vous aurez à faire quelques changements:
Tout d'abord, NestedDocument
besoin d'être un struct tenant votre document ainsi que des informations pour aider le décodeur à comprendre quel est le type de fondement. Quelque chose comme:
type Document struct {
Props here....
Nested []NestedDocument
}
type NestedDocument struct {
Kind string
Payload bson.Raw
}
// Document provides
func (d NestedDocument) Document() (CustomInterface, error) {
switch d.Kind {
case "TypeA":
// Here I am safely assuming that TypeA implements CustomInterface
result := &TypeA{}
err := d.Payload.Unmarshal(result)
if err != nil {
return nil, err
}
return result, nil
// ... other cases and default
}
}
De cette façon, le moteur d'exécution bson
décode l'ensemble Document
mais laisser la charge utile en tant que []byte
.
Une fois que vous avez décodé le Document
principal, vous pouvez utiliser la fonction NestedDocument.Document()
pour obtenir une représentation concrète de votre struct
.
Une dernière chose; Lorsque vous persistez votre Document
, assurez-vous que Payload.Kind
est défini sur , qui représente un document incorporé. Voir les spécifications BSON pour plus de détails à ce sujet.
J'espère que tout est clair et bonne chance pour votre projet.
Vous recherchez quelque chose comme [this] (https://github.com/mongodb/mongo-tools/blob/master/common/bsonutil/converter.go)? –
Pas tout à fait, je voudrais d'abord prendre une structure pour faire tout le traitement nécessaire. –