T#

n8nでMergeノードで2つの入力をCombineでマージする

October 21, 2023

異なるデータソースを扱う際や処理を分岐させた場合に、マージさせる方法のメモ

n8nでMergeノードで2つの入力をCombineでマージする

背景

以下のシチュエーションを想定。

  • パフォーマンス上処理を並列で行いたい
  • 特定のステップで使用するデータ変換があり、シンプル化する

Merge ノードの Combine モード

n8n は基本的にすべてのノードで配列を扱うが、その配列の要素を結合する。 結合の方法は 3 種類あるが、今回は Multiplex は割愛し、Merge By Fields, Merge by Positionを解説(というのも、Multiplex を使用するケースにまだ出会っていないため)。

今回は説明のために Code ノードを使ってテストデータを作成し説明。

Merge By Fields

特定のフィールドで結合する。複数のデータを扱う場合に便利。 今回は Customer データと売上データを id で Merge するというケース。

Merge by Fields flow
Merge by Fields flow
Merge by Fieldsノード。2つのインプットのフィールド名を指定する
Merge by Fieldsノード。2つのインプットのフィールド名を指定する

Output Type をKeep Matchesにするとマッチしたもののみに絞れる。Keep Everythingにすると結合できるレコードがなければ undefined が入る。

マージするデータは以下のコードで作成

return [
{
id: "23423532",
name: "Jay Gatsby",
notes: "Keeps asking about a green light??",
country: "US",
created: "1925-04-10",
},
{
id: "23423533",
name: "José Arcadio Buendía",
notes: "Lots of people named after him. Very confusing",
country: "CO",
created: "1967-05-05",
},
{
id: "23423534",
name: "Max Sendak",
notes: "Keeps rolling his terrible eyes",
country: "US",
created: "1963-04-09",
},
{
id: "23423535",
name: "Zaphod Beeblebrox",
notes: "Felt like I was talking to more than one person",
country: null,
created: "1979-10-12",
},
{
id: "23423536",
name: "Edmund Pevensie",
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
Merge by Position example

マージするデータは以下のコードで作成 今回は単語リストを自然言語処理をする(というテイで)並列処理して最終的に 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ノード設定。簡単。
Merge by Positionノード設定。簡単。

おわりに

これだとシンプルすぎてアレなので、実際のユースケースについても書く。

© 2023 Takashi Toyofuku All rights reserved.