# Kibana painless scripted fields. Loop on array of objects

**URL:** <https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847>\
**Category:** Kibana\
**Created:** [May 22, 2018, 3:20pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847 "2018-05-22T15:20:06Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ramchjob](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ramchjob/32/31480_2.png) [@ramchjob](https://discuss.elastic.co/u/ramchjob)\
**Post date:** [May 22, 2018, 3:20pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/1 "2018-05-22T15:20:06Z")

</div>

Hey ES Gurus,

I been trying to generate reports from es documents in kibana. Below is the sample

```auto
{
"customer" : 
"contact": 
{
"phones" : [
{
"category":"personal",
"number":"1111111111"
},
{
"category":"work",
"number":"2222222222"
}
]

}

}

```

When i use painless script as below

```auto
doc["customer.contact.phones.category.keyword"].values + ':' +doc["customer.contact.phones.number.keyword"].values 

```

The output goes as

`["personal","work"] , ["111111111","2222222222"]` in the discover module.

I am anticipating the output as below and have implemented painless script

```auto
["personal:"1111111111"] ,
["work":"2222222222"]

```

Then i tried using painless loop as below in the scripted field text box and seeing the error. Please help me out

```auto
for(int i=0; doc["customer.contact.phones.number.keyword"].length;i++){
doc["customer.contact.phones.category.keyword"][i].value +':'+ 
doc["customer.contact.phones.number.keyword"][i]
.value}

```

```auto
Error: Request to Elasticsearch failed: {"error":{"root_cause":[{"type":"script_exception","reason":"compile error","script_stack":["... r.keyword\"].length;i++){\ndoc[\"LiveFeed.customer.pr ..."," ^---- HERE"],"script":"for(int i=0; doc[\"customer.contact.phones.number.keyword\"].length;i++){\ndoc[\"customer.contact.phones.category.keyword\"][i].value +':'+ \ndoc[\"customer.contact.phones.number.keyword\"][i]\n.value}","lang":"painless"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"cem-profile-index","node":"rN4VSEjiREi6T-LofTIH2A","reason":{"type":"script_exception","reason":"compile error","script_stack":["... r.keyword\"].length;i++){\ndoc[\"LiveFeed.customer.pr ..."," ^---- HERE"],"script":"for(int i=0; doc[\"customer.contact.phones.number.keyword\"].length;i++){\ndoc[\"customer.contact.phones.category.keyword\"][i].value +':'+ \ndoc[\"customer.contact.phones.number.keyword\"][i]\n.value}","lang":"painless","caused_by":{ **"type":"illegal_argument_exception","reason":"Not a statement."** }}}]},"status":500}

```

---

<div class="post-metadata">

**Author:** ![ppisljar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ppisljar/32/11588_2.png) [@ppisljar](https://discuss.elastic.co/u/ppisljar)\
**Post date:** [May 22, 2018, 3:42pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/2 "2018-05-22T15:42:13Z")

</div>

have you tried something like:

```auto
def l = new ArrayList();

for(int i=0; doc["customer.contact.phones.number.keyword"].values.length;i++){
  l.add(doc["customer.contact.phones.category.keyword"].values[i] +':'+ doc["customer.contact.phones.number.keyword"].values[i])
}

return l;

```

---

<div class="post-metadata">

**Author:** ![ramchjob](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ramchjob/32/31480_2.png) [@ramchjob](https://discuss.elastic.co/u/ramchjob)\
**Post date:** [May 22, 2018, 4:16pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/3 "2018-05-22T16:16:13Z")

</div>

Thanks for the reply Peter. I tried and seeing the error below.

`"lang":"painless","caused_by":{"type":"wrong_method_type_exception","reason":"cannot convert MethodHandle(List)int to (Object)boolean"}}}]},"status":500}`

Looks like the return type to be boolean.

---

<div class="post-metadata">

**Author:** ![ppisljar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ppisljar/32/11588_2.png) [@ppisljar](https://discuss.elastic.co/u/ppisljar)\
**Post date:** [May 22, 2018, 4:20pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/4 "2018-05-22T16:20:35Z")

</div>

try `return l.toArray();` ? also what type of scripted field is it ?

---

<div class="post-metadata">

**Author:** ![ramchjob](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ramchjob/32/31480_2.png) [@ramchjob](https://discuss.elastic.co/u/ramchjob)\
**Post date:** [May 22, 2018, 4:27pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/5 "2018-05-22T16:27:44Z")

</div>

The error still the same after l.toArray();

Below is the screenshot of the same. I see only few datatypes

string, number, boolean , date in type dropdown. After checking elastic search logs, ES itself not liking the script and throwing the exception

`Caused by: java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(List)int to (Object)boolean`

 ![image](https://us1.discourse-cdn.com/elastic/original/3X/3/6/36ccdac396fa4f2e96554f934214585bf58e08cf.png)

---

<div class="post-metadata">

**Author:** ![ppisljar](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ppisljar/32/11588_2.png) [@ppisljar](https://discuss.elastic.co/u/ppisljar)\
**Post date:** [May 22, 2018, 5:04pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/6 "2018-05-22T17:04:04Z")

</div>

sorry, the if statement is broken ....

`for(int i=0; i < doc["customer.contact.phones.number.keyword"].values.length;i++){`

or if you are using older version of es something like this should work:

```auto
def l = new ArrayList();

for(int i=0; i < params._source.customer.contact.phones.length;i++){
  l.add(params._source.customer.contact.phones[i].category +':'+ params._source.customer.contact.phones[i].number])
}

return l.toArray();

```

---

<div class="post-metadata">

**Author:** ![ramchjob](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/ramchjob/32/31480_2.png) [@ramchjob](https://discuss.elastic.co/u/ramchjob)\
**Post date:** [May 22, 2018, 6:06pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/7 "2018-05-22T18:06:52Z")

</div>

Thanks Peter, i am able to get it worked. I see the desired output now.Have a good one

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [June 19, 2018, 6:06pm UTC](https://discuss.elastic.co/t/kibana-painless-scripted-fields-loop-on-array-of-objects/132847/8 "2018-06-19T18:06:55Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
