mgo モデルのインターフェイス タイプについて
MongoDB と Go のコンテキストでは、インターフェイスを使用したデータのモデリングは、動的な性質により課題が発生する可能性があります。インターフェースの。ここでは、発生した問題の簡潔な説明と提案される解決策を示します。
インターフェイスの型の問題
MongoDB のドキュメントベースのデータ モデルは型を提供しません埋め込みドキュメントの情報。 mgo を使用してインターフェイス型を含む MongoDB ドキュメントを Go 構造体にアンマーシャリングする場合、mgo は埋め込まれた各ドキュメントの特定の型を判断できません。これにより、「タイプ bson.M の値はタイプ Node に割り当てられません。」というエラーが発生します。
解決策: インターフェイス タイプのラッピング
この制限に対処するには、1 つのアプローチがあります。型情報を提供するカスタム構造体でインターフェイス型をラップすることです。これにより、mgo はアンマーシャリング中に埋め込まれたドキュメントの特定のタイプを識別できるようになります。
次の例を考えてみましょう。
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
SetBSON 関数の実装
この解決策を完了するには、NodeWithType 型の SetBSON 関数を実装する必要があります。この関数は、型文字列をデコードし、対応する型のインスタンスを作成し、それをアンマーシャリングします。
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
}
結論
このパターンを利用すると、さまざまなタイプの埋め込みドキュメントをアンマーシャリングする機能を維持しながら、インターフェイスを効果的に利用できます。明示的な型情報を提供することにより、mgo はこれらのドキュメントを目的の Go 構造体にシームレスにデコードできます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3