Foreach processor
配列またはオブジェクトの各要素に対してインジェストプロセッサを実行します。
すべてのインジェストプロセッサは、配列またはオブジェクトの要素で実行できます。ただし、要素の数が不明な場合、各要素を同じ方法で処理するのは面倒です。
[](#foreach-options)
**表 20. Foreach オプション**
| 名前 | 必須 | デフォルト | 説明 |
| :-- | :-- | :-- | :-- |
| `````field````` | はい | - | 配列またはオブジェクトの値を含むフィールド。<br> |
| `````processor````` | はい | - | 各要素に対して実行するインジェストプロセッサ。<br> |
| `````ignore_missing````` | いいえ | false | `````true`````の場合、`````field`````が`````null`````または欠落している場合、プロセッサは静かに終了します。<br> |
| `````description````` | いいえ | - | プロセッサの説明。プロセッサの目的や構成を説明するのに便利です。 |
| `````if````` | いいえ | - | プロセッサを条件付きで実行します。[プロセッサを条件付きで実行する](32bff6811baf1efc.md#conditionally-run-processor "プロセッサを条件付きで実行する")を参照してください。 |
| `````ignore_failure````` | いいえ | `````false````` | プロセッサの失敗を無視します。[パイプラインの失敗を処理する](32bff6811baf1efc.md#handling-pipeline-failures "パイプラインの失敗を処理する")を参照してください。 |
| `````on_failure````` | いいえ | - | プロセッサの失敗を処理します。[パイプラインの失敗を処理する](32bff6811baf1efc.md#handling-pipeline-failures "パイプラインの失敗を処理する")を参照してください。 |
| `````tag````` | いいえ | - | プロセッサの識別子。デバッグやメトリクスに便利です。 |
## Access keys and values
配列またはオブジェクトを反復処理する際、`````foreach`````プロセッサは現在の要素の値を`````_ingest._value````` [インジェストメタデータ](32bff6811baf1efc.md#access-ingest-metadata)フィールドに格納します。`````_ingest._value`````は、子フィールドを含む要素全体の値を含みます。`````_ingest._value`````フィールドのドット表記を使用して、子フィールドの値にアクセスできます。
オブジェクトを反復処理する際、`````foreach`````プロセッサは現在の要素のキーを文字列として`````_ingest._key`````に格納します。
`````_ingest._key`````と`````_ingest._value`````は`````processor`````でアクセスおよび変更できます。例については、[オブジェクトの例](da2162b5f61a400b.md#foreach-object-ex)を参照してください。
## Failure handling
もし`````foreach`````プロセッサが要素を処理できず、`````on_failure`````プロセッサが指定されていない場合、`````foreach`````プロセッサは静かに終了します。これにより、配列またはオブジェクトの値全体は変更されません。
## Examples
以下の例は、`````foreach`````プロセッサをさまざまなデータ型とオプションで使用する方法を示しています:
- [配列](da2162b5f61a400b.md#foreach-array-ex)
- [オブジェクトの配列](da2162b5f61a400b.md#foreach-array-objects-ex)
- [オブジェクト](da2162b5f61a400b.md#foreach-object-ex)
- [失敗処理](da2162b5f61a400b.md#failure-handling-ex)
### Array
次のドキュメントを仮定します:
#### Js
``````js
{
"values" : ["foo", "bar", "baz"]
}
`
このforeach
プロセッサがこのサンプルドキュメントで動作するとき:
Js
{
"foreach" : {
"field" : "values",
"processor" : {
"uppercase" : {
"field" : "_ingest._value"
}
}
}
}
処理後、ドキュメントは次のようになります:
Js
{
"values" : ["FOO", "BAR", "BAZ"]
}
Array of objects
次のドキュメントを仮定します:
Js
{
"persons" : [
{
"id" : "1",
"name" : "John Doe"
},
{
"id" : "2",
"name" : "Jane Doe"
}
]
}
この場合、id
フィールドを削除する必要があるため、次のforeach
プロセッサが使用されます:
Js
{
"foreach" : {
"field" : "persons",
"processor" : {
"remove" : {
"field" : "_ingest._value.id"
}
}
}
}
処理後の結果は:
Js
{
"persons" : [
{
"name" : "John Doe"
},
{
"name" : "Jane Doe"
}
]
}
別のオブジェクトの配列の例については、添付プロセッサのドキュメントを参照してください。
Object
#### Js
``````js
{
"products" : {
"widgets" : {
"total_sales" : 50,
"unit_price": 1.99,
"display_name": ""
},
"sprockets" : {
"total_sales" : 100,
"unit_price": 9.99,
"display_name": "Super Sprockets"
},
"whizbangs" : {
"total_sales" : 200,
"unit_price": 19.99,
"display_name": "Wonderful Whizbangs"
}
}
}
`
次のforeach
プロセッサはproducts.display_name
の値を大文字に変更します。
Js
{
"foreach": {
"field": "products",
"processor": {
"uppercase": {
"field": "_ingest._value.display_name"
}
}
}
}
ドキュメントで実行すると、foreach
プロセッサは次のように返します:
Js
{
"products" : {
"widgets" : {
"total_sales" : 50,
"unit_price" : 1.99,
"display_name" : ""
},
"sprockets" : {
"total_sales" : 100,
"unit_price" : 9.99,
"display_name" : "SUPER SPROCKETS"
},
"whizbangs" : {
"total_sales" : 200,
"unit_price" : 19.99,
"display_name" : "WONDERFUL WHIZBANGS"
}
}
}
次のforeach
プロセッサは各要素のキーをproducts.display_name
の値に設定します。products.display_name
が空の文字列を含む場合、プロセッサは要素を削除します。
Js
{
"foreach": {
"field": "products",
"processor": {
"set": {
"field": "_ingest._key",
"value": "{{_ingest._value.display_name}}"
}
}
}
}
前のドキュメントで実行すると、foreach
プロセッサは次のように返します:
Js
{
"products" : {
"Wonderful Whizbangs" : {
"total_sales" : 200,
"unit_price" : 19.99,
"display_name" : "Wonderful Whizbangs"
},
"Super Sprockets" : {
"total_sales" : 100,
"unit_price" : 9.99,
"display_name" : "Super Sprockets"
}
}
}
Failure handling
ラップされたプロセッサにはon_failure
定義がある場合があります。たとえば、id
フィールドはすべての人オブジェクトに存在しない場合があります。インデックスリクエストを失敗させる代わりに、on_failure
ブロックを使用してドキュメントをfailure_indexインデックスに送信し、後で検査できます:
Js
{
"foreach" : {
"field" : "persons",
"processor" : {
"remove" : {
"field" : "_value.id",
"on_failure" : [
{
"set" : {
"field": "_index",
"value": "failure_index"
}
}
]
}
}
}
}
この例では、remove
プロセッサが失敗した場合、これまでに処理された配列要素は更新されます。