Joinノードを使う(その4)

ここのところずっとNode-REDのサンプルを見ながら各ノードの使い方を確認しています。頭出しの記事はこちらをご確認ください。今回はJoinノードの4回目です。終わらねぇ。

確認するサンプルは、前回に引き続き「読み込み > サンプル > flows > node-red > sequence > join > 02 - Manual join mode」です。

メッセージを結合してkey/valueオブジェクトにする


5段目のフローから見ていきます。ざっくりとした流れは以下のとおりです。
  • DataノードでCSVデータを送信する
  • CsvノードでCSVデータをJSONオブジェクトに変換する
    • msg.payloadには以下のような値が指定されたメッセージ4つに分解される
      • { name: "Apple", price: 100 }
  • Changeノードでmsg.payload内の値を以下のプロパティに設定する
    • msg.topic = "Apple"(msg.payload.nameの値)
    • msg.payload = 100(msg.payload.priceの値)
  • Joinノードで、2個の受信メッセージごとにmsg.topicの値をキーとしてkey/valueオブジェクトに結合して送信する




これを実行すると、以下のようにmsg.payloadにJSONオブジェクトが指定されていることを確認できます。


メッセージを結合して結合オブジェクトにする


先ほどは結合した値がkey/valueオブジェクトでしたが、6段目のフローでは単純にオブジェクト結合します。ざっくりとした流れは以下のとおりです。
  • DataノードでJSON配列を送信する
    • nameをキーに持つオブジェクトとpriceをキーに持つオブジェクトを交互に含んでいます(実際、こんなに都合の良いデータが生成されることはあるんだろうか)
  • Splitノードで配列データを個別のメッセージに分割します
  • Joinノードで、2個の受信メッセージごとにオブジェクトに結合して送信する



これを実行すると、以下のようにmsg.payloadに2個ずつのオブジェクトがJSONオブジェクトに結合されたものが指定されていることを確認できます。ちなみに、Joinノードで結合するオブジェクトのキーが被っていると結合対象のメッセージは破棄されるようです(Templateノードで指定している配列要素の2個めのキーをpriceからnameに変更すると確認できます)。このサンプルではTemplateノードで指定したデータのkeyが結合後に被らないようにしてあるので、こんな感じで単純結合できるんですね。


指定した数に達するまでに受信したメッセージを保持して、後続のメッセージを差し替えて結合オブジェクトにする


7段目のフローも結合オブジェクトにしますが、文章にするととてもややこしい動きをします。ざっくりとした流れは以下のとおりです。
  • DataノードでJSON配列を送信する
    • 配列の先頭2つの要素はそれぞれnameとpriceをキーに持つオブジェクトで、その後はorderをキーに持つオブジェクトです
  • Splitノードで配列データを個別のメッセージに分割します
  • Joinノードで、3個のメッセージを受信したらオブジェクトに結合して送信します
    • 最初に受信した2つのメッセージの内容はそのまま保持して、その後受信した後続のメッセージを1つ受信したら3つ目のメッセージを受信したメッセージ差し替えて送信します






これを実行すると、以下のようにmsg.payloadに最初の3個のオブジェクトがJSONオブジェクトに結合されたものが指定されていることを確認できます。その後は、最初の2個のオブジェクトは固定で、4つ目以降のオブジェクトが差し替えられて指定されています。


結果を見るとなんとなく挙動は理解できますが、実際こんなサンプルを利用しなきゃいけない場面はあるのだろうか。

まとめ

ようやく全部見終えたのでまとめます。
  • 特定のプロパティを指定してkey/valueオブジェクトに結合できます
  • 単純にオブジェクトに結合できます
    • 結合対象のキーが被るとそのデータは破棄されます
  • 指定した数に達するまでに受信したオブジェクトを固定し、その後受信したメッセージを差し替えて結合できます
長く続いたJoinノードシリーズがようやく終焉を迎えました。

コメント

このブログの人気の投稿

Joinノードを使う(その1)

kintone-sendgrid-pluginを更新しました(v11)