「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > mgo を使用して MongoDB データをアンマーシャリングする場合、埋め込みドキュメント内のインターフェイス タイプを処理するにはどうすればよいですか?

mgo を使用して MongoDB データをアンマーシャリングする場合、埋め込みドキュメント内のインターフェイス タイプを処理するにはどうすればよいですか?

2024 年 11 月 11 日に公開
ブラウズ:364

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

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