ホームページ  >  記事  >  バックエンド開発  >  インターフェイスを使用して mgo で MongoDB のさまざまなタイプの組み込みノードをモデル化する方法は?

インターフェイスを使用して mgo で MongoDB のさまざまなタイプの組み込みノードをモデル化する方法は?

DDD
DDDオリジナル
2024-10-26 10:34:29761ブラウズ

How to Model Embedded Nodes of Different Types in MongoDB with mgo using Interfaces?

mgo (Go) のモデルとしてのインターフェイス型

問題:

シナリオ内さまざまなタイプのワークフローと組み込みノードが関与する場合、mgo を使用して MongoDB 内のノードをモデリングするためのインターフェイスを使用すると、エラーが発生します。このエラーは、mgo が型情報なしで埋め込まれた Node ドキュメントをアンマーシャリングできないために発生します。

解決策:

この制限を克服するには、両方の Node 型を保持する構造体を定義することを検討してください。および関連する型情報:

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}</code>

ワークフロー構造体内で、NodeWithType 構造体の配列を使用してノードを保存します:

<code class="go">type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}</code>

データを正しくデコードするには、SetBSON 関数を実装します。 on NodeWithType:

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode the type string
   typeStr := r.String()

   // Create a new Node value based on the type string
   switch typeStr {
   case "EmailNode":
      nt.Node = &EmailNode{}
   case "TwitterNode":
      nt.Node = &TwitterNode{}
   default:
      return errors.New("Unknown node type")
   }

   // Unmarshal the remaining data to the Node value
   bsonBytes, err := bson.Marshal(r.Body)
   if err != nil {
      return err
   }
   return bson.Unmarshal(bsonBytes, nt.Node)
}</code>

このアプローチにより、mgo は、NodeWithType 構造体に格納されている型情報に基づいて、埋め込みノードを正しくアンマーシャリングできます。

以上がインターフェイスを使用して mgo で MongoDB のさまざまなタイプの組み込みノードをモデル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。