![n8nでMergeノードで2つの入力をCombineでマージする](/_next/image?url=%2Fassets%2Fposts%2F2023%2F10%2Fn8n-merge-two-nodes%2Ftop.png&w=3840&q=75)
n8nでMergeノードで2つの入力をCombineでマージする
October 21, 2023
異なるデータソースを扱う際や処理を分岐させた場合に、マージさせる方法のメモ
背景
以下のシチュエーションを想定。
- パフォーマンス上処理を並列で行いたい
- 特定のステップで使用するデータ変換があり、シンプル化する
Merge ノードの Combine モード
n8n は基本的にすべてのノードで配列を扱うが、その配列の要素を結合する。
結合の方法は 3 種類あるが、今回は Multiplex は割愛し、Merge By Fields
, Merge by Position
を解説(というのも、Multiplex を使用するケースにまだ出会っていないため)。
今回は説明のために Code ノードを使ってテストデータを作成し説明。
Merge By Fields
特定のフィールドで結合する。複数のデータを扱う場合に便利。 今回は Customer データと売上データを id で Merge するというケース。
![Merge by Fields flow](/_next/image?url=%2Fassets%2Fposts%2F2023%2F10%2Fn8n-merge-two-nodes%2Fmerge-by-fields-flow.png&w=3840&q=75)
![Merge by Fieldsノード。2つのインプットのフィールド名を指定する](/_next/image?url=%2Fassets%2Fposts%2F2023%2F10%2Fn8n-merge-two-nodes%2Fmerge-by-fields-merge-node.png&w=3840&q=75)
Output Type をKeep Matches
にするとマッチしたもののみに絞れる。Keep Everything
にすると結合できるレコードがなければ undefined が入る。
マージするデータは以下のコードで作成
return [{id: "23423532",name: "Jay Gatsby",email: "[email protected]",notes: "Keeps asking about a green light??",country: "US",created: "1925-04-10",},{id: "23423533",name: "José Arcadio Buendía",email: "[email protected]",notes: "Lots of people named after him. Very confusing",country: "CO",created: "1967-05-05",},{id: "23423534",name: "Max Sendak",email: "[email protected]",notes: "Keeps rolling his terrible eyes",country: "US",created: "1963-04-09",},{id: "23423535",name: "Zaphod Beeblebrox",email: "[email protected]",notes: "Felt like I was talking to more than one person",country: null,created: "1979-10-12",},{id: "23423536",name: "Edmund Pevensie",email: "[email protected]",notes: "Passionate sailor",country: "UK",created: "1950-10-16",},];
return [{json: {id: "23423532",sales: 300,},},{json: {id: "23423533",sales: 200,},},{json: {id: "23423534",sales: 400,},},];
[{"id": "23423532","name": "Jay Gatsby","email": "[email protected]","notes": "Keeps asking about a green light??","country": "US","created": "1925-04-10","sales": 300},{"id": "23423533","name": "José Arcadio Buendía","email": "[email protected]","notes": "Lots of people named after him. Very confusing","country": "CO","created": "1967-05-05","sales": 200},{"id": "23423534","name": "Max Sendak","email": "[email protected]","notes": "Keeps rolling his terrible eyes","country": "US","created": "1963-04-09","sales": 400}]
Merge By Position
配列の順番が同じもの同士で結合する。シンプルに 1 要素で処理する場合・要素数が変わらない場合に使えそう(けど、フィールド指定できるなら Merge By Fields にしておいたほうが安全そう)。
![Merge by Position example](/_next/image?url=%2Fassets%2Fposts%2F2023%2F10%2Fn8n-merge-two-nodes%2Fmerge-by-position-flow.png&w=3840&q=75)
マージするデータは以下のコードで作成 今回は単語リストを自然言語処理をする(というテイで)並列処理して最終的に position でマージ。
単語リスト
return [{ json: { word: "apple" } },{ json: { word: "run" } },{ json: { word: "computer" } }];
単語の長さを計算
return items.map(item => {const word = item.json.word;return { json: { word, length: word.length } };});
単語を自然言語処理(というテイで結果を用意)
return items.map((_, index) => {const nlpResult = ["noun", "verb", "noun"][index];return { json: { NLP_result: nlpResult } };});
![Merge by Positionノード設定。簡単。](/_next/image?url=%2Fassets%2Fposts%2F2023%2F10%2Fn8n-merge-two-nodes%2Fmerge-by-position-node.png&w=3840&q=75)
おわりに
これだとシンプルすぎてアレなので、実際のユースケースについても書く。