Mgo (Go) を使用して、多様なノード タイプのワークフローを MongoDB に保存するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-26 19:58:02
オリジナル
611 人が閲覧しました

How Can You Store Workflows with Diverse Node Types in MongoDB using Mgo (Go)?

Mgo (Go) のモデルとしてのインターフェイス: 割り当て可能性エラーの解決

さまざまなタイプのノードで構成されるワークフローを処理する場合、次のような問題が発生する可能性があります。 Golang インターフェースを活用して、その多様な動作をカプセル化したいと考えています。ただし、そのようなワークフローを MongoDB に保存すると、特有の課題が生じます。

割り当て可能性の問題

検索操作中に発生したエラーは、デコードされたドキュメントとノードインターフェース。 Mgo には、各組み込みノードの特定のタイプを決定するために必要なタイプ情報が不足しています。これにより、割り当ての不一致が発生します。

代替アプローチ: 型情報を使用した埋め込み

このハードルを克服するには、埋め込みノード内に型情報をカプセル化することを検討してください。新しい構造体 NodeWithType を定義します。これは、Node インターフェイスと、特定の型を表す Type フィールドで構成されます。

<code class="go">type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}</code>
ログイン後にコピー

カスタム BSON アンマーシャリング

ギャップを埋めるにはデコードされたドキュメントと Go 構造体の間に、NodeWithType の SetBSON 関数を実装します。この関数は、Type フィールドをデコードし、対応する型のインスタンスを作成し、それにアンマーシャリングを委任します。

<code class="go">func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode Type field
   var typeName string
   err := bson.Unmarshal(r["Type"], &typeName)
   if err != nil {
      return err
   }

   // Create an instance of the correct type based on Type field
   var node Node
   switch typeName {
   case "EmailNode":
      node = &EmailNode{}
   case "TwitterNode":
      node = &TwitterNode{}
   }

   // Unmarshal the remaining fields into the created instance
   if err = node.SetBSON(r[typeName]); err != nil {
      return err
   }

   // Assign the created instance to the Node field
   nt.Node = node

   return nil
}</code>
ログイン後にコピー

ワークフロー構造体で、Node スライスを NodeWithType のスライスに置き換えます。

<code class="go">type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}</code>
ログイン後にコピー

このアプローチにより、Mgo はさまざまなタイプの組み込みノードを含むワークフローを正常に見つけてアンマーシャリングできるようになりました。

以上がMgo (Go) を使用して、多様なノード タイプのワークフローを MongoDB に保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!