代码之家  ›  专栏  ›  技术社区  ›  Hatim Stovewala

向嵌套数据类型添加/更新嵌套文档-Elasticsearch

  •  0
  • Hatim Stovewala  · 技术社区  · 7 年前

    假设我有一个带有嵌套文档的文档:

    {
        "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"
            }
        ]
    }
    

    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"
                }
            }
        }
    }
    

    如何实现这一点?为此,我提出了如下方法(更新现有嵌套类型):

    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"
                }
            }
        }
    }
    

    我不确定这是否是一种有效的方法。 但我的主要问题是,我不能保留两个更新命令来实现这两个功能(添加新的嵌套文档和更新现有嵌套文档的字段)。我需要把两者结合在一起。它的工作原理应该类似于如果嵌套文档不存在,那么它应该添加新的嵌套文档,如果存在,那么它应该更新现有的嵌套文档。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Hatim Stovewala    7 年前

    我发现了一种使用更新脚本来实现这一点的方法。 以下是 post .