# Причина ошибки Illegal list shortcut value

**URL:** <https://discuss.elastic.co/t/illegal-list-shortcut-value/121702>\
**Category:** Вопросы на русском языке\
**Created:** [February 27, 2018, 5:17pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702 "2018-02-27T17:17:23Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [February 27, 2018, 5:17pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/1 "2018-02-27T17:17:23Z")

</div>

Помогите понять причину ошибки Illegal list shortcut value

> **Ошибка**
>
> ```
> {
> "error": {
> "root_cause": [
> {
> "type": "script_exception",
> "reason": "runtime error",
> "script_stack": [
> "ctx._source.user.contact.id = 5;",
> " ^---- HERE"
> ],
> "script": "ctx._source.user.contact.id = 5;",
> "lang": "painless"
> }
> ],
> "type": "script_exception",
> "reason": "runtime error",
> "script_stack": [
> "ctx._source.user.contact.id = 5;",
> " ^---- HERE"
> ],
> "script": "ctx._source.user.contact.id = 5;",
> "lang": "painless",
> "caused_by": {
> "type": "illegal_argument_exception",
> "reason": "Illegal list shortcut value [contact]."
> }
> },
> "status": 500
> }
> 
> ```

> **Индекс**
>
> ```
> PUT my_index
> {
> "mappings": {
> "doc": {
> "properties": {
> "user": {
> "type": "nested",
> "properties": {
> "contact": {
> "properties": {
> "id": {
> "type": "integer"
> }
> }
> }
> }
> }
> }
> }
> }
> }
> 
> ```

> **Документ**
>
> ```
> PUT my_index/doc/1
> {
> "user" : [
> {
> "contact" : {
> "id" : 1
> }
> }
> ]
> }
> 
> ```

> **Поиск и обновление**
>
> ```
> POST my_index/_update_by_query
> {
> "script": {
> "lang": "painless",
> "source": "ctx._source.user.contact.id = 5;"
> },
> "query": {
> "nested": {
> "path": "user",
> "ignore_unmapped": true,
> "query": {
> "terms": {
> "user.contact.id": [
> 1
> ]
> }
> }
> }
> }
> }
> 
> ```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 27, 2018, 6:07pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/2 "2018-02-27T18:07:57Z")

</div>

> [@bio](#):
>
> ctx.\_source.user.contact.id

`user` - это массив, попробуйте так `ctx._source.user[0].contact.id = 5`

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [February 27, 2018, 6:36pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/3 "2018-02-27T18:36:05Z")

</div>

Сработало.  
Получается, что перед записью придётся сначало индекс узнать. Для индекса придётся пускать цикл.  
В некоторых случаях может быть более глубокая вложенность(nested -\> inner object -\> nested), может есть более универсальный способ ?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 28, 2018, 4:38am UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/4 "2018-02-28T04:38:55Z")

</div>

Я не понимаю, в чем проблема, если честно. Если `user` - это массив, то надо с ним работать как с массивом, перебирая все элементы в скрипте в поиске нужного, если это не массив, то надо его хранить подобающим образом:

```auto
PUT my_index/doc/1
{
  "user": {
    "contact": {
      "id": 1
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![bio](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/bio/32/76409_2.png) [@bio](https://discuss.elastic.co/u/bio)\
**Post date:** [February 28, 2018, 6:10am UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/5 "2018-02-28T06:10:38Z")

</div>

Я думал, что эластик или java(которую я к сожалению не знаю) как-то сами разруливают ситуацию с массивами 🙂  
В моём случае, особеность в том, что у меня есть информация только о полном пути до конечного объекта. Хотел обойтись без циклов, а без них не получается 🙂

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 28, 2018, 3:01pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/6 "2018-02-28T15:01:12Z")

</div>

Во время операции updated, Json преобразуется в HashMap, но все массивы внутри него преобразуются в ArrayList. То есть с точки зрения индексации, разницы между

```auto
{
  "user": {
    "contact": {
      "id": 1
    }
  }
}

```

и

```auto
{
  "user" : [
    {
      "contact" : {
        "id" : 1
      }
    }
  ]
}

```

нет. Но для update, который работает на уровне исходного source, user в первом случае - HashMap, а во втором случае ArrayList.

---

<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:** [March 28, 2018, 3:01pm UTC](https://discuss.elastic.co/t/illegal-list-shortcut-value/121702/7 "2018-03-28T15:01:16Z")

</div>

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