2017-10-16 6 views
0

J'ai une collection de documents qui contiennent un tableau d'un type d'interface personnalisé que j'ai. Exemple ci-dessous Que dois-je faire pour Unmarshal le bson de mongo afin que je puisse éventuellement retourner une réponse JSON?Comment démonter le bson d'un mongo d'une interface imbriquée avec mgo?

type Document struct { 
    Props here.... 
    NestedDocuments customInterface 
} 

Que dois-je faire pour mapper les interfaces imbriquées aux bonnes structures?

+0

Vous recherchez quelque chose comme [this] (https://github.com/mongodb/mongo-tools/blob/master/common/bsonutil/converter.go)? –

+0

Pas tout à fait, je voudrais d'abord prendre une structure pour faire tout le traitement nécessaire. –

Répondre

0

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.