Elasticsearch: remove/update field inside nested object
To add a new element to your nested field you can proceed like this:
$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '{ "script" : "ctx._source.list_data += newElement", "params": { "newElement": { "list_id" : 121, "timestamp" : 1469050965 } }}'
To remove an existing element from your nested field list, you can proceed like this:
$ curl -XPOST 'localhost:9200/index/type/1212/_update?pretty' -d '{ "script" : "ctx._source.list_data.removeAll{it.list_id == remove_id}", "params": { "remove_id" : 122 }}'
I don't know why, but I find that
ctx._source.list_data.removeAll{it.list_id == remove_id}
can't work. Instead I use removeIf
like this:
ctx._source.list_data.removeIf{list_item -> list_item.list_id == remove_id}
where list_item
could be arbitrary string.
I was getting error [UpdateRequest] unknown field [params]
as I was using the latest version of ElasticSearch (7.9.0.), seems like the syntax is changed a bit.
Following should work for newer versions of ElasticSearch:
$ curl -XPOST 'localhost:9200/<index-name>/_update/1212'{ "script": { "source": "ctx._source.list_data.removeIf(list_item -> list_item.list_id == params.remove_id);", "params": { "remove_id": 122 } }}