2016-04-01 8 views
1

私は私の頭を包み込むように努力してきたことがあり、最良のアプローチについてのいくつかの指針を見ているということはかなり奇妙な質問をしています。私はいくつかの異なるタイプの構造体を含むコレクションをフィルタリングするためにmgoを使用しており、事実の後に適切な構造体にbson.Mからキャストしようとしています。基本的には、コレクションをフィルタリングして、それぞれの結果を見て、適切な構造体に共通のフィールドキャストを基にしたいと思っています。bson.M to struct

ここでは、使用しようとしている構造体のサンプルを示します。

type Action interface { 
    MyFunc() bool 
    } 

    type Struct1 struct { 
    Id bson.ObjectId `bson:"_id,omitempty"` 
    Type string `bson:"type"` 
    Struct1Only string `bson:"struct1only"` 
    } 

    func (s Struct1) MyFunc() bool { 
    return true 
    } 

    type Struct2 struct { 
    Id bson.ObjectId `bson:"_id,omitempty"` 
    Type string `bson:"type"` 
    Struct2Only string `bson:"struct2only"` 
    } 

    func (s Struct2) MyFunc() bool { 
    return true 
    } 

私の最初のアイデアのような何かを行うことでした。

var result bson.M{} 
err := c.Find(bson.M{nil}).One(&result) 

はその後、適切な構造体へのタイプフィールドとキャストのスイッチをオンにし、正直なところ、私は行くことは新しいですし、モンゴ、そこにあると確信していますこれを行うより良い方法。助言がありますか?おかげ

+0

2つの異なる構造型を1つのコレクションに格納していますか?どちらの構造体にも固有のフィールドの存在を明示的に切り替えることなく、結果をキャストする正しい方法を推測する方法はわかりません。 –

+0

さらに、2つの構造体が1つのフィールドで異なるだけであれば、おそらくそれを組み合わせることができます。存在しないフィールドは単にnilと評価されます。 –

+0

私はこの例の構造体を単純化しました。私のプロジェクトでは、約10個のフィールドがあり、実際には約15個のフィールドが共有されています。私は、構造体を組み合わせることができますし、型に応じてnilされるいくつかのフィールドを持って、私はそれがきれいになると思うように構造体を分離しておくために探していた。 – ShootThePuck91

答えて

1

あなたは構造体へのbson.Mを変換する必要はありません、代わりに、あなたが直接あなたの場合は

var struct2 Struct2 
err := c.Find(bson.M{nil}).One(&struct2) 

一つの機能に構造体のポインタを渡すには、まだ構造体にbson.Mを変換したいです、マーシャリングと非マーシャルを使用する

var m bson.M 
var s Struct1 

// convert m to s 
bsonBytes, _ := bson.Marshal(m) 
bson.Unmarshal(bsonBytes, &s)