如何在无痛脚本中深度克隆对象字段



我想在更新对象字段时创建一个新字段来存储旧值。

原文档为:

{
"_index" : "test",
"_id" : "15895_-1",
"_source" : {
"device" : {
"standard": {
"name" : "unknown",
"brand" : "unknown"
},
"other": "other"
}
}
}

这是我的updateByquery代码:

GET test/_update_by_query
{
"script": {
"source": """
if (params.deviceStandard != null) {
ctx._source['device_algoed'] = ctx._source['device'];

ctx._source['device']['standard']['series'] = params.deviceStandard.series;
ctx._source['device']['standard']['brand'] = params.deviceStandard.brand;
}
""",
"params": {
"deviceStandard": {
"series" : "unknown",
"brand" : "OPPO"
}
}
},
"query": {
"bool": {
"filter": {
"term": {
"_id": "15895_-1"
}
}
}
}
}

当我改变ctx._source['device']['standard']时,ctx._source['device_algoed']也会改变。那么如何对ctx._source['device']['standard']进行深度克隆呢ctx._source['device_algoed']?

你能做的就是在原始地图的基础上创建一个新的地图:

ctx._source['device_algoed'] = [:];
ctx._source['device_algoed'].putAll(ctx._source['device']);

然后你可以随意修改ctx._source['device']而不影响ctx._source['device_algoed']

就是这样!

最新更新