Я пытаюсь написать 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
элементы используются, только если документ уже не существует).