2017-12-15 11 views
0

私の目標は、サブツリー内の配列を持つ入力ドキュメントを取得し、そのドキュメント全体をそのドキュメントのコピーの配列にコピーし、コピー。一例として、さまざまな設定のドキュメントをjoltで変換する

{ 
    "config": { 
    "activeConfig": { 
     "sourceDatabase": "test", 
     "targetSites": [ 
     { 
      "siteName": "location1", 
      "targetDatabase": "devl", 
      "siteShortName": "123" 
     }, 
     { 
      "siteName": "location2", 
      "targetDatabase": "123", 
      "siteShortName": "123" 
     } 
     ] 
    } 
    }, 
    "secondData": { 
    "queries": [ 
     { 
     "Tablename": "abc", 
     "Query": "123" 
     } 
    ] 
    } 
} 

予想される出力:

[ { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite" : { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     } 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
}, 
{ 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite" : { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
} ] 

次のように私が持っているJOLTの仕様はこれまでです:

[ 
    { 
    "operation": "shift", 
    "spec": { 
     "config": { 
     "activeConfig": { 
      "targetSites": { 
      "*": { 
       "@4": "[]", 
       "@": "[].config.activeConfig.currentSite" 
      } 
      } 
     } 
     } 
    } 
    } 
] 

ドキュメントを開始

どちらが私を閉じているe、しかしそれほどはありません。

[ { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ] 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
}, { 
    "config" : { 
    "activeConfig" : { 
     "currentSite" : { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     } 
    } 
    } 
}, { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ] 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
}, { 
    "config" : { 
    "activeConfig" : { 
     "currentSite" : { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } 
    } 
    } 
} ] 

この仕様は、私が探している構造を作成しますが、それらをマージしません。最終的な配列は、その中に4つの項目、元の文書の2つのコピー、および構成配列の2つの項目で終わります。私の目標は、構成アレイの2つの項目を文書のコピーにマージすることです。そのため、元の文書を2つコピーし、それぞれに1つの値を設定します。

私はとの緊密得ているだけで、他の仕様は、最終アレイ内の2台の文書のコピーになりますが、currentSiteセクションは、各コピーに設定配列から全ての値で終了

[ 
    { 
    "operation": "shift", 
    "spec": { 
     "config": { 
     "activeConfig": { 
      "targetSites": { 
      "*": { 
       "@4": "[&]", 
       "@": "[&].config.activeConfig.currentSite" 
      } 
      } 
     } 
     } 
    } 
    } 
] 

ですなく

[ { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ] 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
}, { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ] 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
} ] 

(理由として、この文書の次のステップは、各ファイルを個別に設定することを可能にするNiFiフローの2つの流れファイルに分割するであろう)

あたり1に

あなたが提供できるインプットまたは援助に感謝します。

更新:

私が把握するのに苦労しています別の興味深い行動を発見しました。

次の仕様を使用すると、私には意味をなさない出力が得られます。

仕様:

[ 
    { 
    "operation": "shift", 
    "spec": { 
     "config": { 
     "activeConfig": { 
      "targetSites": { 
      "*": { 
       "@4": "[&]", 
       "@": "[&].config.activeConfig.currentSite&" 
      } 
      } 
     } 
     } 
    } 
    } 
] 

出力:

[ { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite0" : { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, 
     "currentSite1" : { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
}, { 
    "config" : { 
    "activeConfig" : { 
     "sourceDatabase" : "test", 
     "targetSites" : [ { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } ], 
     "currentSite0" : { 
     "siteName" : "location1", 
     "targetDatabase" : "devl", 
     "siteShortName" : "123" 
     }, 
     "currentSite1" : { 
     "siteName" : "location2", 
     "targetDatabase" : "123", 
     "siteShortName" : "123" 
     } 
    } 
    }, 
    "secondData" : { 
    "queries" : [ { 
     "Tablename" : "abc", 
     "Query" : "123" 
    } ] 
    } 
} ] 

私は、出力パスを変更しようとした "@": "[&] .config.activeConfig.currentSite &" 2つの場所で&を使用します。これは、上記の2番目の例と同様に動作しますが、両方の値が両方のコピーで終わる場合がありますが、この場合、currentSite0で終了し、currentSite1で終わり、配列インデックス0と1の両方で終了します。つまり、&式 "[&] .config.activeConfig.currentSite &"の中で評価されたときに値0と1を同時に持つように動作しています。私は非常に明確にその行為のニュアンスを見逃しています。

答えて

1

2つのシフトを使用する必要があります。一般的に言えば、配列で「もの」をするときは、あなたがしようとしている「物」ごとにシフト操作をしなければなりません。

あなたの場合、1)コンテンツを出力配列に複製したい、2)特定のターゲットを複製することです。

私はそれを把握することができなかった理由を説明スペック

[ 
    // Step 1: Make the copies of the input data, based on the number 
    // of items in the targetSites array. 
    { 
    "operation": "shift", 
    "spec": { 
     "config": { 
     "activeConfig": { 
      "targetSites": { 
      "*": { // targetSites array index 
       // go back up 4 levels and grab the whole tree "@4" 
       // and write it to the output as a top level array 
       // indexed by the "targetSites array index" 
       "@4": "[&1]" 
      } 
      } 
     } 
     } 
    } 
    }, 
    { 
    // Step 2 : Annoyingly copy everything across, but use the 
    // value of the top level array index, to copy the "right" 
    // data out of the targetSites array. 
    "operation": "shift", 
    "spec": { 
     "*": { // top level array index 
     "config": { 
      "sourceDatabase": "[&2].config.sourceDatabase", // straight copy across 
      "activeConfig": { 
      "targetSites": { 
       "@": "[&4].config.activeConfig.targetSites", // straight copy across 
       // 
       // Nifty but very rarely used feature. 
       // Use "&3" to lookup the "current" value of the top level array index 
       // and then use that as an index into the targetSites array, and copy 
       // that across as "currentSite" 
       "&3": "[&4].config.activeConfig.currentSite" 
      } 
      } 
     }, 
     "secondData": "[&1].secondData" // straight copy across 
     } 
    } 
    } 
] 
+0

... 1でそれをすべて行うことが本当のハードしようとしていました。これは私が必要としているように見え、またジョルトについてもっと教えてくれます。私は答えを提供することの上に説明のコメントを感謝します。乾杯! –

関連する問題