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

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

DDD
リリース: 2024-10-26 10:34:29
オリジナル
834 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート