Подтвердить что ты не робот

Elasticsearch upserting и добавление к массиву

Я пытаюсь написать script, который обновит новую пользовательскую запись до ElasticSearch, обновит любую информацию, если пользователь уже существует, и добавит новый объект PaymentInfo к массиву пользователей Payments, если он существует в объекте обновления, Вот упрощенная версия того, с чем я работаю до сих пор:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{
    "doc_as_upsert": true, 
    "doc": {
        "customerId": "1",
        "firstName": "Mark",
        "lastName": "Z",
        "emailAddress": "[email protected]",
        "paymentInfo": {
            "pid": "1",
            "amt": "10"
        }
    }
}'

Это почти то, что я хочу, чтобы он вставлял документ надлежащим образом или обновлял документ, если пользователь существует с тем же идентификатором, но ему не хватает аспекта для добавления этого paymentInfo к массиву user paymentInfos, если пользователь уже существует. Как сейчас, он просто переопределяет объект paymentInfo. Я попытался добавить этот script к обновлению JSON:

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"

но elasticsearch игнорирует элементы doc, когда указан элемент script.

Я чувствую, что здесь мне что-то не хватает, но я не уверен. Может ли кто-нибудь здесь помочь мне?

Edit: Я также пробовал следующее:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{    
    "script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}",
    "upsert": {
        "customerId": "1",
        "firstName": "Mark",
        "lastName": "Z",
        "emailAddress": "[email protected]",
        "paymentInfo": {
            "pid": "1",
            "amt": "10"
         }
    },
    "params": {
         "paymentInfo": {
            "pid": "1",
                "amt": "10"
         }
    }
}'

Что также почти делает то, что я хочу, поскольку он добавляет объекты paymentInfo, когда я запускаю script несколько раз, но в противном случае он не обновляет сам документ (т.е. если я снова запустил script, изменяя Mark на Mindy, он не обновляется, поскольку upsert элементы используются, только если документ уже не существует).

4b9b3361

Ответ 1

вам нужно добавить некоторые скобки массива в часть вставки script.

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = [paymentInfo]}"

Свойство "paymentInfos" в первом разделе определяется как объект, поэтому также может вызывать падение.