我想在更新对象字段时创建一个新字段来存储旧值。
原文档为:
{
"_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']
就是这样!