中級向け

n8n Mergeノードの使い方:2つのデータを突き合わせるときに消えるもの

n8nのMergeノードで2系統のデータを結合する方法を、実際に動かして確認した結果とあわせて解説します。既定では一致しなかった項目が消え、数値と文字列も別物として扱われます。

動作確認: — n8n 2.36.8 / Merge ノード v3.2

2つの流れに分かれたデータを1つにまとめるのが Mergeノードです。 「別々のAPIから取ったデータを、IDで突き合わせる」といった処理に使います。

この記事はn8n の基本操作ができる人向けです。 IFやSwitchで分けたデータを合流させたり、 2つのデータソースを結合したりする場面を想定しています。

内容は n8n 2.36.8 / Merge ノード v3.2 で実際に動かして確認しています。 検証の過程で、ドキュメントを読んだだけでは分からない挙動が2つ見つかりました。

Mergeノードは何をするものか

複数の入力を受け取って、1つの出力にまとめるノードです。

他のノードと違って入力が2つ以上あります(既定は2つ、最大10まで増やせます)。 そして重要な性質として、つながっているすべての入力の処理が終わるまで待ちます。

まとめ方には4つのモードがあります。

モード 何をするか
Append 入力1の全件、続いて入力2の全件、と順に並べる
Combine 条件に従って1件ずつ突き合わせて合体させる
SQL SQLのクエリを書いて結合する
Choose Branch 片方の入力のデータだけを出す

単純に「両方のデータを並べたい」だけなら Append、 「IDで紐づけて1件にまとめたい」なら Combine です。

Combine の3つの方式

Combine を選ぶと、さらに3つから選べます。

方式 突き合わせ方
Matching Fields(既定) 指定したフィールドの値が同じものを結合
Position 1件目と1件目、2件目と2件目、と順番で結合
All Combinations 全組み合わせを作る

実務で最も使うのが Matching Fields です。 「入力1の id と入力2の id が同じものをまとめる」という使い方をします。

既定では、一致しなかった項目が消える

ここが最大の注意点です。

Matching Fields には Output Type という設定があり、既定は Keep Matches (一致したものだけを残す)です。

Mergeノードの設定画面。左の入力パネルにSource A(Input 1)3件とSource B(Input 2)3件が表示され、中央にMode: Combine、Combine By: Matching Fields、Fields to Match: id、Output Type: Keep Matches が並び、右の出力は1件だけになっている
左の入力は3件ずつ。中央の Output Type が Keep Matches のままだと、右の出力は1件になる

設定名は Output Type です。 「結合の方法」ではなく「何を出力するか」という 名前になっているので、探すときに見落としやすい項目です。

入力1: id 1, 2, 3 / 入力2: id 1, 2, 9(一致するのは 1 と 2)Keep Matches(既定)一致した 2件 だけが出力されるid 3 と id 9 は消える。エラーにならないKeep Non-Matches一致しなかった 2件 だけが出力されるKeep Everything一致した 2件 + 一致しなかった 2件 = 4件データを落としたくないときはこれ
Output Type で「何を残すか」が決まる。既定はデータが減る設定になっている。

実際に確認した結果

次の2つのデータを id で突き合わせました。

入力1 入力2
{ id: 1, name: 'あ' } { id: '1', score: 10 }
{ id: 2, name: 'い' } { id: 2, score: 20 }
{ id: 3, name: 'う' } { id: 9, score: 90 }

3件と3件を入れて、出力は1件だけでした。

{ "id": 2, "name": "い", "score": 20 }
3件と3件を入れて、出てくるのは1件。エラーは出ない

消えた理由は2つあります。

  • id: 3 と id: 9 は相手がいないので、Keep Matches では出力されない
  • id: 1 と id: '1' は一致しなかった

2つ目が次の話です。

数値と文字列は別物として扱われる

Fuzzy Compare という設定があり、既定はオフです。 この項目は最初から見えているわけではなく、Options の「+ Add option」から追加すると現れます。

MergeノードのOptionsを開いた状態。Fuzzy Compareのトグルがオフで表示されている
Options に追加してはじめて画面に出る。見えていない=無効、ではない

オフのままだと、数値の 1 と文字列の '1' は一致しません。

APIから返ってくるIDは、見た目が数字でも文字列であることが珍しくありません。 片方がデータベース由来の数値、もう片方がAPI由来の文字列、という組み合わせで 「なぜか1件も一致しない」という状態になります。

Fuzzy Compare をオンにすると、型の違いを吸収して比較します。 先ほどのデータで試したところ、id: 1 と id: '1' が一致するようになりました。

{ "id": "1", "name": "あ", "score": 10 }
{ "id": 2,   "name": "い", "score": 20 }

ただし型が揃っているのが本来あるべき姿です。 Fuzzy Compare は応急処置として使い、可能なら Edit FieldsやCodeで型を揃えておく方が、 後から見たときに分かりやすくなります。

一致しなかった項目も残すには

ここは検証していなければ間違えるところでした。

Options には Include Any Unpaired Items(対になっていない項目も含める)という 設定があります。名前から「一致しなかった項目も含める設定」に見えます。

しかし、これをオンにしても id: 3 と id: 9 は出てきませんでした。 この設定は、件数が違うときの扱いに関するもので、 Matching Fields で一致しなかった項目を拾う用途ではないようです。

正しいのは Output Type を変えることです。

Output Type 出力されるもの
Keep Matches(既定) 一致したものだけ
Keep Non-Matches 一致しなかったものだけ
Keep Everything 両方。一致したものも、しなかったものも

Keep Everything にして実行したところ、4件すべてが出力されました。

{ "id": "1", "name": "あ", "score": 10 }
{ "id": 2,   "name": "い", "score": 20 }
{ "id": 3,   "name": "う" }
{ "id": 9,   "score": 90 }

一致しなかった項目は、持っている側のフィールドだけを持った状態で出てきます。 id: 3 には score がなく、id: 9 には name がありません。

後続の処理では、フィールドが無い場合を考慮する必要があります。

同じ名前のフィールドがぶつかったら

入力1と入力2の両方に同じ名前のフィールドがある場合、 Clash Handling でどちらを優先するか決められます。

既定は後の入力を優先し、入れ子のフィールドは深く結合します。 「片方が空のときだけもう片方を使う」という設定もあります。

意図しない上書きは気づきにくいので、 結合前にフィールド名が重複していないか確認しておくと安全です。

うまくいかないときの切り分け

  1. 1件も出力されない — 型が違っていないか。Fuzzy Compare を試す
  2. 件数が減っている — Output Type が Keep Matches のままではないか
  3. フィールドが無いと言われる — 一致しなかった項目は片側のフィールドしか持たない
  4. 値が上書きされている — 同名フィールドの Clash Handling を確認する
  5. ノードが動かない — すべての入力がつながって実行されるまで待つ仕様

次に読む

次に読む