Adding/Updating 嵌套文档到嵌套数据类型 - Elasticsearch
Adding/Updating nested documents to Nested datatypes - Elasticsearch
假设我有一个包含嵌套文档的文档:
{
"dept_name" : "IT",
"dept_code" : "IT",
"staffs" : [
{
"emp_name" : "A",
"emp_id" : "1",
"emp_salary" : "10000"
},
{
"emp_name" : "B",
"emp_id" : "2",
"emp_salary" : "20000"
},
{
"emp_name" : "C",
"emp_id" : "3",
"emp_salary" : "30000"
}
]
}
现在,我需要将“staffs”添加到嵌套类型中,我已经知道如何这样做了。下面是更新代码(添加到嵌套类型):
GET dept/dept/1/_update
{
"script": {
"lang": "painless",
"inline": "ctx._source.staffs.add(params.dept);",
"params": {
"dept": {
"emp_name" : "D",
"emp_id" : "4",
"emp_salary" : "40000"
}
}
}
}
但是如果我需要更新一个或两个嵌套类型的字段怎么办。例如,我需要将“emp_salary”更新为“emp_id”= 3 的 35000。
如何实现?为此,我想出了如下方法(更新现有的嵌套类型):
GET dept/dept/1/_update
{
"script": {
"lang": "painless",
"inline": """
int i=0;
for(LinkedHashMap obj:ctx._source.staffs){
if(obj.id==params.dept.emp_id)
{
ctx._source.staffs[i]=params.dept;
}
i++;
""",
"params": {
"dept": {
"emp_name" : "C",
"emp_id" : "3",
"emp_salary" : "35000"
}
}
}
}
我不确定这是否是一种有效的方法。
但我的主要问题是,我不能保留两个更新命令来实现这两种功能(添加新的嵌套文档和更新现有嵌套文档的字段)。我需要将两者合二为一。它应该像如果嵌套文档不存在那么它应该添加新的嵌套文档,如果它存在那么它应该更新现有的嵌套文档。
我找到了使用更新脚本执行此操作的方法。
这里是 post.
的 link
假设我有一个包含嵌套文档的文档:
{
"dept_name" : "IT",
"dept_code" : "IT",
"staffs" : [
{
"emp_name" : "A",
"emp_id" : "1",
"emp_salary" : "10000"
},
{
"emp_name" : "B",
"emp_id" : "2",
"emp_salary" : "20000"
},
{
"emp_name" : "C",
"emp_id" : "3",
"emp_salary" : "30000"
}
]
}
现在,我需要将“staffs”添加到嵌套类型中,我已经知道如何这样做了。下面是更新代码(添加到嵌套类型):
GET dept/dept/1/_update
{
"script": {
"lang": "painless",
"inline": "ctx._source.staffs.add(params.dept);",
"params": {
"dept": {
"emp_name" : "D",
"emp_id" : "4",
"emp_salary" : "40000"
}
}
}
}
但是如果我需要更新一个或两个嵌套类型的字段怎么办。例如,我需要将“emp_salary”更新为“emp_id”= 3 的 35000。 如何实现?为此,我想出了如下方法(更新现有的嵌套类型):
GET dept/dept/1/_update
{
"script": {
"lang": "painless",
"inline": """
int i=0;
for(LinkedHashMap obj:ctx._source.staffs){
if(obj.id==params.dept.emp_id)
{
ctx._source.staffs[i]=params.dept;
}
i++;
""",
"params": {
"dept": {
"emp_name" : "C",
"emp_id" : "3",
"emp_salary" : "35000"
}
}
}
}
我不确定这是否是一种有效的方法。 但我的主要问题是,我不能保留两个更新命令来实现这两种功能(添加新的嵌套文档和更新现有嵌套文档的字段)。我需要将两者合二为一。它应该像如果嵌套文档不存在那么它应该添加新的嵌套文档,如果它存在那么它应该更新现有的嵌套文档。
我找到了使用更新脚本执行此操作的方法。 这里是 post.
的 link